Vue 和 React 区别有以下 11点:
- 响应式原理不同
- 监听数据变化的实现原理不同
- 组件写法不同
- Diff 算法不同
- 核心思想不同
- 数据流不同
- 组合不同功能的方式不同
- 组件通信方法不同
- 模板渲染方式不同
- 渲染过程不同
- 框架本质不同
1. 响应式原理不同
vue: vue会遍历data数据对象,使用 Object.definedProperty() 将每个属性都转换为 getter 和 setter,每个 Vue 组件实例都有一个对应的 watcher 实例,在组件初次渲染的时候会记录组件用到了哪些数据,当数据发生改变的时候,会触发 setter 方法,并通知所有依赖这个数据的 watcher 实例调用 update 方法来触发组件的 compile 渲染方法,进行渲染数据。
react: react 主要是通过 setState() 方法来更新状态,状态更新之后,组件也会重新渲染。
2. 监听数据变化的实现原理不同
vue: Vue 通过 getter/setter 以及一些函数的劫持,能精确知道数据变化
react: React 默认是通过 比较引用的方式(diff)进行的,如果不优化可能你导致大量不必要的 VDOM 的重新渲染。为什么 React 不精确监听数据变化呢?这是因为 Vue 和 React 设计理念上的区别,Vue 使用的是可变数据,而 React 更强调数据的不可变,两者没有好坏之分。
3. 组件写法不同
vue: Vue 的组件写法是通过 template 的单文件组件格式。
react: React 的组件写法是 JSX + inline style,也就是把 HTML 和 CSS 全部写进 JS 中。
4. Diff 算法不同
vue 和 react 的 diff算法都是进行同层次的比较,主要有以下两点不同:
- vue 对比节点,如果节点元素类型相同,但是 className 不同,认为是不同类型的元素,会进行删除重建,但是 react 则会认为是同类型的节点,只会修改节点属性。
- vue 的列表比对采用的是首尾指针法,而 react 采用的是从左到右依次比对的方式,当一个集合只是把最后一个节点移动到了第一个,react 会把前面的节点依次移动,而 vue 只会把最后一个节点移动到最后一个,从这点上来说 vue 的对比方式更加高效。
5. 核心思想不同
vue: Vue 的核心思想是尽可能的降低前端开发的门槛,是一个灵活易用的渐进式双向绑定的 MVVM 框架。
react: React 的核心思想是声明式渲染和组件化、单向数据流,React 既不属于 MVC 也不属于 MVVM 架构。
6. 数据流不同
vue: Vue1.0 中可以实现两种双向绑定:父子组件之间,props可以双向绑定;组件和 DOM 之间可以通过 v-model 双向绑定。Vue2.x 中去掉了第一种,也就是父子组件之间不能双向绑定了(但是提供了一个语法糖自动帮你通过事件的方式修改),并且 Vue2.x 已经不鼓励组件对自己的props进行任何修改了。
react: React一直不支持双向绑定,提倡的是单向数据流,称之为 onChange/setState() 模式。不过由于我们一般都会用 Vuex 以及 Redux 等单向数据流的状态管理框架,因此很多时候我们感受不到这一点的区别了。
7. 组合不同功能的方式不同
vue: Vue组合不同功能的方式是通过 mixin,Vue中组件是一个被包装的函数,并不简单的就是我们定义组件的时候传入的对象或者函数。比如我们定义的模板怎么被编译的?比如声明的 props 怎么接收到的?这些都是 vue 创建组件实例的时候隐式干的事。由于 vue 默默帮我们做了这么多事,所以我们自己如果直接把组件的声明包装以下,返回一个 HoC,那么这个被包装的组件就无法正常工作了。
react: React 组合不同功能的方式是通过 HoC(高阶组件)。React 最早也是使用 mixins 的,不过后来他们觉得这种方式对组件侵入太强会导致很多问题,就弃用了 mixinx 转而使用 HoC。高阶组件本质就是高阶函数,React 的组件是一个纯粹的函数,所以高阶函数对 React 来说非常简单。
8. 组件通信方法不同
vue: Vue中有三种方式可以实现组件通信:父组件通过 props 向子组件传递数据或者回调,虽然可以传递回调,但是我们一般只传数据;子组件通过事件向父组件发送消息;通过 V2.2.0 中新增的 provide/inject 来实现父组件向子组件注入数据,可以跨越多个层级。
react: React中也有对应的三种方式:父组件通过 props 可以向子组件传递数据或者回调;可以通过 context 进行跨层级的通信,这其实和 provide/inject 起到的作用差不多。React 本身并不支持自定义事件,而 Vue 中子组件向父组件传递消息有两种方式:事件和回调函数,但 Vue 更倾向于使用事件。在 React 中我们都是使用回调函数的,这可能是他们二者最大的区别。
9. 模板渲染方式不同
vue: Vue 是在和组件 JS 代码分离的单独的模板中,通过指令来实现的,比如条件语句就需要 v-if 来实现对这一点,这样的作法显得有些独特,会把 HTML 弄得很乱。
react: React 是在组件 JS 代码中,通过原生 JS 实现模板中的常见语法,比如插值,条件,循环等,都是通过 JS 语法实现的,更加纯粹更加原生。
10. 渲染过程不同
vue: Vue 可以更快地计算出 Virtual DOM 的差异,这是由于它在渲染过程中,会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树。
react: React 在用用的状态被改变时,全部子组件都会重新渲染。通过 shouldComponentUpdate 这个生命周期方法可以进行控制,但 Vue 将此视为默认的优化。
11. 框架本质不同
vue: Vue 本质是 MVVM 框架,由 MVC 发展而来
react: React 是前端组件化框架,由后端组件化发展而来