Skip to main content

# 谈谈 React 和 Vue 的区别

## 回答关键点​

`推模型与拉模型` `模板与 JSX`

React 和 Vue 同为现代化的 Web 前端开发框架。相同之处都是采用数据驱动视图的思想，以虚拟 DOM 为基础，以组件化的方式组织应用，让开发者无需关心 DOM 细节，从更高的层次设计应用。不同之处在于，具体组件的编写方式（template vs jsx），数据响应模型以及具体的生态。

## 知识点深入​

### 1. 开发体验的区别​

学习曲线

- Vue：旨在降低前端开发门槛，学习曲线平缓，对了解 HTML、CSS 及 JS 的传统模式的前端开发和后端开发人员更友好。
- React：传播自身的概念和思想，需要了解 JSX 的相关知识，组件中的一切都可以通过 JavaScript 灵活控制，上手成本相较于 Vue 来说略高。

JSX 与模板语法

- Vue：默认使用基于 HTML 的模板语法，将模板、样式及逻辑划分开来使关注点分离。也可以选配 JSX 支持。
- React：默认使用 JSX 编写组件，将 HTML 和 CSS 组合到 JavaScript 中。在选用 TypeScript 作为开发语言时，可以更方便的整合相关工具链。
- 关于模板语法与 JSX 对比的一些举例：
  - 定制化的模板语法糖能够使编码更加简洁，相应的是稍微增加一点记忆成本。
  - JSX 写起来可能稍微繁琐一点，但其中的逻辑都是原生 JavaScript 控制的，在理解代码上，无需引入额外的概念。
  - Vue 单文件组件在拆分模板时，需要新建组件。
  - React 组件在拆分 JSX 时，可以灵活存在于变量或当前文件的新的组件中。

社区生态差异

- Vue：中文生态繁荣。偏向全家桶式的集成解决方案，官方提供了开箱即用的 Vuex，Vue Router 组件，使开发者可以不必纠结于基础组件的选择。
- React：将选择权交给开发者，并没有提供默认的组合模板，开发者可以自行组合社区中成熟的组件来构建应用，如 React Router，Redux，Mobx 等。

### 2. 核心概念的区别​

数据响应模型

- Vue 是推模型，当数据改动时，界面会自动更新。
  - Vue 通过 defineProperty 监听数据的改动，可以做到在数据改变时，精准细粒度的更新对应的视图。
- React 是拉模型，当数据改动时，需要手动调用 setState 更新界面。
  - React 倾向于函数式编程，`view = f(state)`，鼓励使用不可变数据，当 state 发生改变时，react 默认会使用浅比较来对比状态的差异，更具对比结果决定是否更新视图。
- 这两种模型不是互斥的，在 React 中可以使用像 MobX 之类的库实现推模型；在 Vue 中可以 freeze 数据，或调用组件的更新方法实现拉模型。

## 参考资料​

1. Vue
2. React

Loading script...