推模型与拉模型 模板与 JSX
React 和 Vue 同为现代化的 Web 前端开发框架。相同之处都是采用数据驱动视图的思想,以虚拟 DOM 为基础,以组件化的方式组织应用,让开发者无需关心 DOM 细节,从更高的层次设计应用。不同之处在于,具体组件的编写方式(template vs jsx),数据响应模型以及具体的生态。
学习曲线
Vue:旨在降低前端开发门槛,学习曲线平缓,对了解 HTML、CSS 及 JS 的传统模式的前端开发和后端开发人员更友好。
React:传播自身的概念和思想,需要了解 JSX 的相关知识,组件中的一切都可以通过 JavaScript 灵活控制,上手成本相较于 Vue 来说略高。
JSX 与模板语法
定制化的模板语法糖能够使编码更加简洁,相应的是稍微增加一点记忆成本。
JSX 写起来可能稍微繁琐一点,但其中的逻辑都是原生 JavaScript 控制的,在理解代码上,无需引入额外的概念。
Vue 单文件组件在拆分模板时,需要新建组件。
React 组件在拆分 JSX 时,可以灵活存在于变量或当前文件的新的组件中。
社区生态差异
Vue:中文生态繁荣。偏向全家桶式的集成解决方案,官方提供了开箱即用的 Vuex,Vue Router 组件,使开发者可以不必纠结于基础组件的选择。
React:将选择权交给开发者,并没有提供默认的组合模板,开发者可以自行组合社区中成熟的组件来构建应用,如 React Router,Redux,Mobx 等。
数据响应模型
Vue 是推模型,当数据改动时,界面会自动更新。
React 是拉模型,当数据改动时,需要手动调用 setState 更新界面。
view = f(state),鼓励使用不可变数据,当 state 发生改变时,react 默认会使用浅比较来对比状态的差异,更具对比结果决定是否更新视图。这两种模型不是互斥的,在 React 中可以使用像 MobX 之类的库实现推模型;在 Vue 中可以 freeze 数据,或调用组件的更新方法实现拉模型。