数据更近机制不同
Vue
Vue 进行数据拦截/代理,它对侦测数据的变化更敏感、更精确,基于Proxy的响应式系统,精确追踪依赖并只更新相关组件
React
React 推崇函数式,它直接全量重新渲染组件树(虚拟DOM Diff),这样更粗暴,但是更简单,为了弥补性能,React做了时间分片,还暴漏给开发者一些性能优化API,如:React.memo、useMemo、useCallback、shouldComponentUpdate
而且React 并不知道什么时候“应该去刷新”,触发局部重新变化是由开发者手动调用setState完成
hooks影响
这直接影响了两者的hooks实现:
React基于链表实现,每次组件被 render 的时候都会顺序执行所有的 hooks,所以要求开发者不能在不同 hooks 调用中使用判断条件,因为 if 会导致顺序不正确,从而导致报错
Vue只会被注册调用一次 ,Vue 之所以能避开这些麻烦的问题,根本原因在于它对数据的响应是基于响应式的,是对数据进行了代理的。他不需要链表进行 hooks 记录,它对数据直接代理观察
适用场景
频繁渲染、高CPU开销(比如动画、大量Canvas、WebGL、数据可视化):
React的做法:
- React 每次
setState都会走完整的 Virtual DOM diff 流程。 - 虽然看起来浪费,但它的 diff 是 O(n) 且稳定可预测的。
- 配合
React.memo、useMemo、useCallback、shouldComponentUpdate,可以很好地控制 diff 范围。 - Fiber 架构(16+)让它能把渲染分片、暂停、恢复(时间分片调度),避免阻塞主线程。
所以在这种场景中,React会更稳定,不容易掉帧
Vue的做法:
- Vue 会追踪每个组件的依赖(
reactive + effect),当依赖变更时只更新相关组件。 - 如果项目中有大量响应式依赖关系、频繁的依赖变更,Vue 的依赖追踪(依赖收集、触发、调度)会造成依赖追踪的额外开销。
所以在这种场景中,Vue 可能因为频繁触发响应式回调导致性能抖动
中低频渲染 / 常规交互(表单、后台):
React的做法:setState会走全量diff,手动优化成本较高,所以在这种场景中,React不适合
Vue的做法:响应式数据自动绑定模板,依赖追踪精准更新,所以在这种场景中,Vue更合适
设计风格不同
单拿事件系统来说两者是怎么实现的:
React
React 事件系统庞大而复杂。其中,它暴漏给开发者的事件不是原生事件,是 React 包装过合成事件
Vue
Vue就是纯绑定事件
总结
React 设计是改变开发者,提供强大而复杂的机制,开发者按照我的来;Vue 是适应开发者,让开发者怎么爽怎么来
预编译优化
Vue
Vue3.0 提出的动静结合的 DOM diff 思想,之所以能够做到动静结合的 DOM diff,是因为 Vue core 可以静态分析 template,在解析模版时,整个 parse 的过程是利用正则表达式顺序解析模板,当解析到开始标签、闭合标签、文本的时候都会分别执行对应的回调函数,来达到构造 AST 树的目的
React
React 就是局部重新渲染,React所拿到的就是一堆递归 React.createElement的执行调用,它无法从模版层面进行静态分析。因此 React JSX 过度的灵活性导致运行时可以用于优化的信息不足
总结
Vue和React各自有各自的优势,我们在进行技术选型的时候需要根据不同的情况进行选择