Vue和React区别

47 阅读3分钟

数据更近机制不同

Vue

Vue 进行数据拦截/代理,它对侦测数据的变化更敏感、更精确,基于Proxy的响应式系统,精确追踪依赖并只更新相关组件

React

React 推崇函数式,它直接全量重新渲染组件树(虚拟DOM Diff),这样更粗暴,但是更简单,为了弥补性能,React做了时间分片,还暴漏给开发者一些性能优化API,如:React.memouseMemouseCallbackshouldComponentUpdate

而且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.memouseMemouseCallbackshouldComponentUpdate,可以很好地控制 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各自有各自的优势,我们在进行技术选型的时候需要根据不同的情况进行选择