React

React的数据监听变化的原理是通过进行对虚拟Dom(对象)树和真实的Dom树来引入比较进行局部的渲染。(需要使用PureComponent/shouldComponent来优化。否则
可能导致大量不必要的VDOM的重新渲染)

Vue

vue的数据监听变化的原理是通过getter/setter以及一些函数的劫持,能够精确的知道数据的变化,不需要特别的优化能到很好的性能

React 和 Vue设计理念不同, React是按照MAC框架中V这一层,它更关注的是如何根据状态创建可服用的UI组件,如何根据组件创建可服用的UI。Vue则是按照MVVM框架设计。M表示数据层,V表示页面显示层,VM则是让数据层驱动影响页面的变化,页面层的改变影响数据的变化,

ReduX 和 VueX

在 Redux 中,我们每一个组件都需要显示的用 connect 把需要的 props 和 dispatch 连接起来。

在 Vuex 更加灵活一些,组件中既可以 dispatch action 也可以 commit updates,而 Redux 中只能进行 dispatch,并不能直接调用 reducer 进行修改。

从实现原理上来说,最大的区别是两点:
Redux 使用的是不可变数据,而Vuex的数据是可变的。Redux每次都是用新的state替换旧的state,而Vuex是直接修改。
Redux 在检测数据变化的时候,是通过 diff 的方式比较差异的,而Vuex其实和Vue的原理一样,是通过 getter/setter来比较的

React特点:
1.声明式设计模式(声明式编程声明式编程表明想要实现什么目的,应该做什么,但是不指定具体怎么做。声明式点一杯酒,只要告诉服务员:我要一杯酒即可;)

React中的声明式示例:带有标记的地图

const map = new Map.map(document.getElementById('map'), {
    zoom: 4,
    center: {lat,lng}
});

const marker = new Map.marker({
    position: {lat, lng},
    title: 'Hello Marker'
});

marker.setMap(map);

这是在JavaScript中命令式创建地图、创建标记以及在地图上添加标记的步骤;

React组件中显示地图的方式:

<Map zoom={4} center={lat, lng}>
    <Marker position={lat, lng} title={'Hello Marker'}/></Map>

声明式编程方式使得React组件很容易使用,最终的代码简单易于维护。

2.组件
  • 为程序编写独立的模块化组件,可以在其他组件或代码中来复用。从来实现更好的维护,减少代码量。提高效率。
  • 以下是一个倒计时组件
import React, {Component} from 'react'

export default class countDown extends Component {
  constructor(props) {
    super(props);
    this.state = {
      day: 0,
      hour: 0,
      minute: 0,
      second: 0
    }
  }
  componentDidMount() {
    if(this.props.endTime){
      this.countFun(this.props.endTime);
    }
  }
  //组件卸载取消倒计时
  componentWillUnmount(){
    clearInterval(this.timer);
  }

  countFun = (time) => {
    this.timer = setInterval(() => {
      //防止倒计时出现负数
      if (time > 1000) {
        time -= 1000;
        let day = Math.floor((time / 1000 / 3600) / 24);
        let hour = Math.floor((time / 1000 / 3600) % 24);
        let minute = Math.floor((time / 1000 / 60) % 60);
        let second = Math.floor(time / 1000 % 60);
        this.setState({
          day:day,
          hour:hour < 10 ? "0" + hour : hour,
          minute:minute < 10 ? "0" + minute : minute,
          second:second < 10 ? "0" + second : second
        })
      } else {
        clearInterval(this.timer);
        //倒计时结束时触发父组件的方法
        //this.props.timeEnd();
      }
    }, 1000);
  };

  render() {
    return (
      <span style={{ fontSize: '12px', color: '#4C5FC1' }} >{this.state.day}天{this.state.hour}小时{this.state.minute}分钟{this.state.second}秒</span>
    )
  }
}

// 之后多个页面需要时 只需引入即可, 从而减少不必要重复代码

import countDown form './countDown';
<countDown endTime={****}/>
3.单向流数据
  • 简单的单向数据流(unidirectional data flow)是指用户访问View,View发出用户交互的Action,在Action里对state进行相应更新。state更新后会触发View更新页面的过程。这样数据总是清晰的单向进行流动,便于维护并且可以预测。
4.高效的性能
  • react采用了虚拟Dom,所谓虚拟Dom实际上其实就是在js和真实Dom中间加了一个缓存,利用dom diff算法避免了所有的没必要的操作