Skip to content

Vue 和 React 区别/对比

相同点

  • 组件化
  • 虚拟DOM
  • 单向数据流
  • 都向函数式编程靠拢:具体的表现就是 Vue 推出了 Composition(组合式) API,React 推出了 hooks,并且官方推荐函数式组件,类组件逐渐淘汰。

核心范式差异

  • 模板系统

Vue:单文件组件(SFC) + 模板语法(支持v-bind/v-model指令)。Vue 3 也支持 JSX,但社区仍以模板语法为主,而且在 Vue 中使用 JSX 会失去很多编译时的优化。

React:JSX + 纯 JavaScript 表达式。

  • 模板渲染

Vue:使用模板语法进行渲染。更容易做编译时优化。

React:使用 JSX 进行渲染。它提供了更好的灵活性和更容易的组合,但是编译时优化难实现,React19 编译器至今也未能给一个很好的答复。

  • 响应式原理

Vue 3:

  • 基于 Proxy 的响应式系统 + Composition API,自动跟踪依赖关系

  • 简单总结 Vue 流程:
    渲染函数执行 -> 触发getter -> 收集依赖(这个组件依赖了count) -> 修改count -> 触发setter -> 通知依赖的组件 -> 组件重新渲染生成新虚拟DOM -> Patch -> 更新真实DOM

React 18:

  • 基于调度器的协调机制(Fiber架构)+ 状态快照特性(通过useState/useReducer)。显示的 告诉 react 该更新了。(setStatedispatch

  • 简单总结 React 流程:
    setState -> 标记需要更新 -> 重新执行组件函数生成新虚拟DOM -> Diff 新旧虚拟DOM -> 计算最小变更 -> 提交到真实DOM

组件存在的形式

  • Vue:大家都知道在 Vue 中一个 .vue 文件就是一个 Vue 组件,所以想正常的在一个.vue 文件中定义多个 Vue 组件是不可能的。

  • React:在 React 中一个 .jsx 文件可以定义多个组件,一个组件就是一个函数。

状态管理

  • Vue:提供官方状态管理库 Pinia(原Vuex),深度集成响应式系统。

  • React:依赖社区方案(Redux、Zustand等),需手动处理状态更新。

diff优化

  • Vue:更加细粒度的更新,也就是大名鼎鼎的靶向更新。得益于 template 模版,可以在编译时就对代码进行分析出哪些节点是动态的。

  • React:引入了 fiber,采用时间切片(requestIdleCallback和requestAnimationFrame)的方式进行优化。在 React 中的 JSX 是相当灵活,想对他进行静态分析很难实现。
    Fiber 协调算法:主要的目标是提高 React 应用的性能,尤其是动画、布局和手势等场景的性能。Fiber 能够为 React 的渲染和更新提供更好的可预测性,并能够利用分块更新(chunking)、暂停、中止或重用工作的能力,以及为不同类型的更新分配优先级。

样式处理

  • Vue:支持 scoped CSS 和 CSS Modules 等。

  • React:依赖于 CSS Modules 和 CSS-in-JS 方案,或者使用 BEM 命名规范。

上手难度

  • Vue:相对容易上手、入门,因为它的模板语法和组件化设计更直观,拥有简洁的 API 和设计。易于上手,特别是对于初学者。 Vue 内置了很多黑魔法,比如 SFC、编译器宏、指令、scoped 等,其中最大的黑魔法就是单文件组件 SFC。只要我们按照Vue的设计规范来,就能轻松的写出漂亮的代码。

  • React:相对较难上手,因为它的 JSX 语法和状态管理方式,而且开发大部分像在写原生 js 一样。
    在 React 社区中有高阶组件、compose 函数、纯函数等概念,但是这些概念在 Vue 社区中很少提及。

中文文档

  • Vue:尤大和大部分 Vue 团队成员都是国人,所以每当英文文档更新后,对应的中文文档就会很快的更新。

  • React:官方中文文档由社区维护,更新速度较英文版略有延迟(滞后)。

社区支持

  • Vue:社区和生态系统相对较小,但拥有丰富的官方库和工具。核心团队维护的官方库包括 Vue Router、Pinia、Vitest 等。

  • React:拥有更大且更成熟的社区,拥有更丰富的第三方库和工具。核心团队专注核心库,其他交给社区。

选择 React 还是 Vue 时,如何考虑?

  • 项目需求:如果项目需要大量的灵活性和复杂度,或者与现有的 React 生态系统集成,我可能会选择 React。如果项目需要快速原型开发和较低的初始学习门槛,Vue 可能是更好的选择。

  • 团队经验:选择团队成员更熟悉的框架通常会提高开发效率和减少成本。

  • 社区和生态:根据项目中可能会用到的库和工具,社区和生态系统的大小和激活度可能会影响我的选择。

  • 长期维护和更新:考虑到长期的项目维护和更新,选择一个有良好支持和更新记录的框架是重要的。

  • 性能需求:虽然两者在性能上都很优秀,根据具体的性能需求和优化可能性,Vue 更好一点。

总结

特性React 18Vue 3
核心原理不可变数据 + 协调(Reconciliation)可变数据 + 响应式代理(Proxy)
触发方式显式。需要调用 setStatedispatch 来通知更新。隐式/自动。直接修改响应式对象的值即可触发更新。
数据粒度组件级别。状态变更会导致整个组件(以及其子组件默认可能)重新渲染,再通过Diff找出变化。属性级别。通过依赖收集,能精确知道哪个状态被哪个组件依赖,更新更精准。
心智模型函数式。UI是状态的函数,状态不可变,每次更新都是“推倒重来”然后找差异。响应式。数据是可变的,建立数据和UI之间的“响应关系”,数据变则UI自动变。
优点1. 数据流清晰,易于调试(状态不可变,历史可追溯)。
2. 灵活性极高,与语言本身(JS)结合紧密。
3. 并发特性(Concurrent Features)提供了更高级的调度控制。
1. 开发体验流畅,心智负担小,直接修改数据即可。
2. 更新效率高,依赖收集使得更新更精确。
3. 开箱即用,内置的响应式系统提供了非常强大的功能(computed, watch等)。
缺点/挑战1. 需要手动优化(如useMemo, useCallback)来避免不必要的子组件重渲染。
2. 对于复杂状态管理,通常需要借助额外的库(Redux, Zustand等)。
1. 响应式系统黑盒程度更高,需要理解refreactive等特定API。
2. 更大的运行时(Runtime)包体积,因为响应式系统内置在框架中。
生态倾向给予开发者极大的自由,但也需要开发者自己负责更多事情(如优化、状态管理)。提供更多约定俗成开箱即用的解决方案,引导性更强。
事件处理使用驼峰命名(如onClick)的props传递函数使用v-on指令绑定事件(如@click)
TypeScript源码是 js,需要额外安装 @types/react(react-dom) 等包源码 ts 编写,配合 defineComponent 等辅助类型
SSR支持Next.js提供完整SSR方案Nuxt.js提供全栈解决方案
移动端React NativeUniapp
扩展机制高阶组件(HOC)/自定义Hooks自定义指令/插件系统
新特性Server Components/React Forget编译器Vapor Mode/宏系统改进

上次更新于:

👁️‍🗨️总访问量 次 | 👤访客数 次 | 🏃已运行 545 天