相同之处:
1、使用 Virtual DOM
2、提供了响应式 (Reactive) 和组件化 (Composable) 的视图组件
3、将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库
不同之处:
在 React 应用中,当某个组件的状态发生变化时,它会以该组件为根,重新渲染整个组件子树。在 Vue 应用中,组件的依赖是在渲染过程中自动追踪的,所以系统能精确知晓哪个组件确实需要被重渲染。
react 是函数式的思想,
把组件设计成纯组件,状态和逻辑通过参数传入,所以在react中,是单向数据流,推崇结合immutable来实现数据不可变。 改变state 之后重新渲染走完渲染流程,所以一个组件更新,下面的子组件都会更新。react的性能优化需要手动去做,而vue的性能优化是自动的
。 一般使用shouldComponentUpdate 优化,或者PureComponent(PureComponent就是重写了shouldComponentUpdate
)
模板和 JSX:
1、React与Vue最大的不同是模板的编写。
Vue鼓励你去写近似常规HTML的模板。
写起来很接近标准HTML元素,只是多了一些属性。
<ul>
<template v-for="item in items">
<li>{{ item.msg }}</li>
<li class="divider"></li>
</template>
</ul>
React推荐你所有的模板通用JavaScript的语法扩展——JSX书写
.但使用JavaScript而不是模板来开发,赋予了开发者许多编程能力。
<ul className="pasta-list">
{
Object.keys(this.state.pastadishes).map(key =>
<PastaItem index={key} key={key} details={this.state.pastadishes[key]} addToOrder={this.addToOrder} orders={this.state.orders[key]} />
)
}
</ul>
性能:
1、在react中,当组件状态改变时,它会触发整个子组件数重新渲染,以根组件作为渲染基点。为了避免不必要的子组件重新渲染,你需要使用PureComponent或者实现 shouldComponentUpdate。
2、在Vue中,一个组件在渲染期间依赖于自动追踪,因此系统知道提前预判哪一个组件需要渲染当组件状态发生改变时。每个组件可以被认为具有自动为你实现shouldComponentUpdate,不需要注意嵌套的组件。
状态管理:
1、在React中一个比较大的内容就是函数式编程。如果你用过现在流行的Redux状态管理库,你大部分的开发时间都是在写函数式的内容。
2、与Redux类似,Vuex也受到Flux的启发。 然而,与Redux不同的是,Vuex改变了状态,而不是使状态不可变,并像Redux的“reducer”函数一样完全替代它。
vue 的双向数据绑定:
vue 和react 其实都是单向数据流,但是vue 支持双向绑定。
先介绍一下 mvvm:
JS 几个流行的框架 Vuejs、Ember.js、AngularJS 都使用 MVVM 模式,该模式叫做视图模型双向数据绑定,以达到数据和视图快速同步的目的。
- View: 视图,模板,显示数据的;
- Model: 代表数据,可以在 Model 层中定义数据修改和操作的业务逻辑
- ViewModel :连接 Model 和 View。
那么如何通过ViewModel 链接View 和Model 达到数据同步呢?
1、Model (数据)-> View(视图),
2、View(视图)-> Model (数据)
实现数据传递,我们就要去监听数据变化和视图的变化
监听DOM 改变:
- 就是 DOM 的改变,我们监听到之后,将模型变量 message 做同步更改!就是视图改变传递到了模型上
监听模型数据变化,数据劫持:
var o = {}; // 创建一个新对象
// 在对象中添加一个属性与存取描述符的示例
var messageValue;
Object.defineProperty(o, "message", {
get : function(){
return messageValue;
},
set : function(newValue){
messageValue = newValue;
},
});
关于
Object.defineProperty
大家可以参考:Object.defineProperty。除此之外 ES6 的 Proxy 也可以完成此项功能。据称 vue3 就会使用 Proxy 代替 defineProperty。
观察者模式,Observer
观察者模式(也叫模型 Model - 视图 View 模式、源 Source - 收听者 Listener 模式或从属者模式)是设计模式的一种。在此模式中,一个目标对象管理所有依赖它的观察者对象,并且在本身的状态改变时发出通知
。也就是本例中,模型就是目标对象,而所需要更新的各种视图DOM就是观察者
。