React与Vue对比

482 阅读4分钟

什么是MVVM:

  • Model: 域模型,用于持久化,通过 Ajax/fetch 等 API 完成客户端和服务端业务 Model 的同步。在层间关系里,它主要用于抽象出 ViewModel 中视图的 Model。
  • View: 作为视图模板存在
  • ViewModel: 作为视图的模型,为视图服务。ViewModel 层把 View 需要的层数据暴露,并对 View 层的 数据绑定声明、 指令声明、 事件绑定声明 负责,也就是处理 View 层的具体业务逻辑。ViewModel 底层会做好绑定属性的监听。当 ViewModel 中数据变化,View 层会得到更新;而当 View中声明了数据的双向绑定(通常是表单元素),框架也会监听 View 层(表单)值的变化。一旦值变化,View 层绑定的 ViewModel 中的数据也会得到自动更新。

在MVVM架构下,View和Model之间没有直接的联系,它们通过ViewModel进行交互,Model和ViewModel之间是交互是双向的,因此,View和Model的数据变化是同步的。 开发者只需专注于ViewModel中业务逻辑的编写,View层将自动响应,能够极大的提高效率。

MVVM三大要素

  • 响应式:Vue 如何监听到 data 的每个属性变化

  • 模板引擎:Vue 的模板如何被解析,指令如何处理

    (用Object.defineProperty,将data的属性代理到vm上)

  • 渲染:Vue 的模板如何被渲染成 html,渲染过程是怎样的

    (模板最终转化成JS函数(render函数:with方法))

1. react是MVVM吗?

不是,react可以作为MVVM中第二个V,也就是View,但是并不是MVVM框架。仅仅专注于View层没有与任何的Modal进行绑定。
但是react也可以实现MVVM 如与redux-form结合。

2.数据是不是可变的

react:整体是函数式的思想,把组件设计成纯组件,状态和逻辑通过参数传入,所以在react中,是单向数据流,推崇结合immutable来实现数据不可变。
react在setState之后会重新走渲染的流程,如果shouldComponentUpdate返回的是true,就继续渲染,如果返回了false,就不会重新渲染,PureComponent就是重写了shouldComponentUpdate,然后在里面作了props和state的浅层对比。
 
默认是通过比较引用的方式进行的,如果不优化(PureComponent/shouldComponentUpdate)可能导致大量不必要的VDOM的重新渲染


vue:响应数据,也就是基于数据改变的,通过对每一个属性建立Watcher来监听,当属性变化的时候,响应式的更新对应的虚拟dom。

通过 getter/setter 以及一些函数的劫持,能精确知道数据变化,不需要特别的优化就能达到很好的性能

3.模版引擎 VS JSX

react的jsx函数式编程,在经过转译之后,会变成 React 创建 Element 的一个方法。
React.createElement('h1',null,`Hello world!`),
jsx创建dom的方式性能相比模版引擎会更好。

vue使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。

4.组件通信的区别

在Vue和React中父子组件的数据传输都是单向的,我们在使用时不建议在组件中对传输过来的值进行修改,而应该是将值返回到父组件中在父组件中改变值。

Vue 中有三种方式可以实现组件通信:

  • 父组件通过 props 向子组件传递数据或者回调,虽然可以传递回调,但是我们一般只传数据,而通过 事件的机制来处理子组件向父组件的通信
  • 子组件通过$emit事件向父组件发送消息。
  • 通过 V2.2.0 中新增的 provide/inject来实现父组件向子组件注入数据,可以跨越多个层级。

在 React 中,也有对应的三种方式:

  • 父组件通过 props 可以向子组件传递数据或者回调

  • 可以通过 context 进行跨层级的通信,这其实和 provide/inject 起到的作用差不多。

React 本身并不支持自定义事件,Vue中子组件向父组件传递消息有两种方式:事件和回调函数,而且Vue更倾向于使用事件。但是在 React 中我们都是使用回调函数的,这可能是他们二者最大的区别。