Vue 和 React 的比较
自从入了 Vue 的坑,都快忘记了 React
最近突然想起来 React,这么久没有接触,想试着玩一玩。
回想起大学时,学长们的分享,总是说 Vue 更易上手,所以就入了 Vue 的坑,但是仔细想想,自己却从来没有亲自去认真了解过 React,真是罪过…
趁此机会了解一下 React,试着把 Vue 和 React 进行一下比较。在网上找到一篇大佬的分享,觉得非常棒,文章内容很详细,链接我放到后文中。
我看完之后想简单总结性的记一下
异同点
Vue 和 React 都是用于构建用户界面的 JavaScript 库,它们都提供了组件化、声明式编码等特性。它们之间有一些相似点,但也有一些区别。
相同点
- 都使用 Virtural DOM
- 都使用组件化思想,流程基本一致
- 都是响应式,推崇单向数据流
- 都有成熟的社区,都支持服务端渲染
Vue 和 React 实现原理和流程基本一致,都是使用 Virtual DOM + Diff 算法。
通用流程
Vue 和 React 通用流程:
- vue template/react jsx
- render 函数
- 生成 VNode
- 当有变化时,新老 VNode diff -> diff 算法对比,并真正去更新真实 DOM。
Virtual DOM
为什么Vue和React都选择Virtual DOM
(React 首创 VDOM,Vue2.0 开始引入 VDOM)?
- 减少直接操作 DOM。框架给我们提供了屏蔽底层 dom 书写的方式,减少频繁的整更新 dom,同时也使得数据驱动视图
- 为函数式 UI 编程提供可能(React 核心思想)
- 可以跨平台,渲染到 DOM(web)之外的平台。比如 ReactNative,Weex
差异点
核心思想不同
Vue推崇灵活易用(渐进式
开发体验),数据可变
,双向数据绑定(依赖收集)
。
React的函数式编程
这个基本盘不会变。
组件实现不同
Vue源码实现是把options挂载到Vue核心类上,然后再new Vue({options})拿到实例(vue组件的script导出的是一个挂满options的纯对象而已)。
React内部实现比较简单,直接定义render函数以生成VNode,而React内部使用了四大组件类包装VNode
,不同类型的VNode使用相应的组件类处理,职责划分清晰明了(后面的Diff算法也非常清晰)。
响应式原理不同
Vue依赖收集,自动优化
,数据可变。Vue递归监听data的所有属性,直接修改。当数据改变时,自动找到引用组件重新渲染。
React基于状态机,手动优化
,数据不可变,需要setState驱动新的State替换老的State。当数据改变时,以组件为根目录,默认全部重新渲染
diff 算法不同
Vue Diff使用双向链表
,边对比,边更新DOM。
React主要使用diff队列
保存需要更新哪些DOM,得到patch树,再统一操作批量更新DOM
事件机制不同
Vue原生事件使用标准Web事件
。Vue组件自定义事件机制,是父子组件通信基础。Vue合理利用了snabbdom库的模块插件
React原生事件被包装
,所有事件都冒泡到顶层document监听,然后在这里合成事件下发。基于这套,可以跨端使用事件机制,而不是和Web DOM强绑定。React组件上无事件,父子组件通信使用props