玩命加载中 . . .

初识 React

一、jQuery

JS 的函数库,对原生 JS 的 API 进行了封装,只是语法简单了本质还是用选择器($)在操作 DOM。

可以进行选中元素、操作 CSS、遍历 DOM、事件、JS 动画、AJAX 等一些增删改查、筛选的操作。

缺点:数据和视图耦合,频繁操作 DOM(导致页面频繁重绘),影响页面性能。

二、Vue

2.2.1 特点

渐进式 JavaScript 框架,易上手,包含大量插件(全家桶)。

Vue 基于 MVVM 模式,将数据层和视图层完全解耦分离(开放封闭原则),以数据驱动视图,只关心数据,DOM操作被封装。

React 只支持内存到界面的单向变化,Vue 支持内存和界面数据的双向交流:

通过数据劫持结合发布者-订阅者模式,通过 Object.defineProperty() 将 data 的属性代理到 vm 上,劫持各个属性的 setter、getter,一旦数据变动(修改 data)立马发布消息给订阅者,触发相应的监听回调响应式的更新视图层。

拓展:属性都有两个对应的方法,一个是 get 方法,一个是 set 方法,都是回调函数。

  • get:当需要读取当前属性值时执行回调,根据相关数据计算并返回当前属性的值。
  • set:用来监视属性值的变化,一旦属性值改变就调用 set 更新相关属性数据。

2.2.2 我对 MVVM 的理解

看了 Vue 的源码我发现 Vue 的 MVVM 实现包含了两个重要的技术:a. 模板解析 b. 数据绑定

  • 模板解析用来初始化组件界面,解析两个部分:大括号表达式和指令

  • 数据绑定用来实现更新数据,界面就自动变化的功能,主要靠的是数据劫持

分析:我们写代码的时候 Vue 底层相当于 new 了一个 MVVM,它会创建两个对象,先是创建一个 Observe,用来劫持(或者叫监视)data 中所有层次的属性,同时还为每一个属性创建了另外一种对象,叫 Dep,几个属性就对应几个 Dep。

这些准备工作完成 MVVM 会再创建一个叫 Compile 的对象,它有两个作用,最重要的是去编译模板(也就是编译大括号表达式和指令),这时会去调用一个叫 Updater 的对象来初始化页面,同时 Compile 还会为模板的每个表达式(事件指令表达式除外)创建一个 Watcher,并指定更新节点的回调函数,一旦创建了 Watcher,就会去建立 Watcher 和 Dep 之间的相互关系,将 Watcher 添加到所有对应的 Dep 中从而让 Dep 可以通过 Watcher 去调用 Updater 更新视图,将 Dep 添加到 Watcher 只是为了防止重复建立。

其实到这里初始化的整个流程就完了,它做了两件事:实现初始化显示,为更新做了准备(实现了数据劫持并创建了对应的 Watcher 和 Dep)

接下来比如我们点击了一个按钮来更新某一个属性,这会被 Observe 里面的 set 知道,set 会先去通知该属性对应的那一个 Dep,Dep 再去通知所有相关的 Watcher,由于前面初始化阶段指定了更新节点的回调函数,Watcher 就调用回调函数去找 Updater 里面的方法去更新界面。

三、React

用于构建用户界面的 JavaScript 库,严格上只针对 MVC 的 view 层。

3.3.1 特点

  • 申明式编码:不用再操作 DOM,只需要更新数据,数据更新,界面就自动变化(数据驱动视图变化)
  • 组件化编码:将界面的每个功能模块拆分为组件进行封装,组件复用(props 传递复用)、方便维护
  • 跨平台:可用 Node 进行服务器渲染,或使用 React Native 开发原生移动应用,支持客户端和服务器渲染
  • 高效
  • 单向数据流

3.3.2 React高效原因

  • 虚拟(Virtual)DOM,不总是直接操作 DOM
  • DOM Diff 算法,最小化页面重绘

四、尤大阐述两大框架

Vue 设计者尤雨溪亲自回答:

虽然 Vue 和 React 两者在定位上有一些交集,但差异也是很明显的。

Vue 使用的是 web 开发者更熟悉的模板与特性,Vue 的 API 跟传统 web 开发者熟悉的模板契合度更高,比如 Vue 的单文件组件是以模板 + JavaScript + CSS 的组合模式呈现,它跟 web 现有的 HTML、JavaScript、CSS 能够更好地配合。React 的特色在于函数式编程的理念和丰富的技术选型。Vue 比起 React 更容易被前端工程师接受,这是一个直观的感受;React 则更容易吸引在 FP 上持续走下去的开发者。

使用习惯和思维模式上考虑,对于一个没有任何 Vue 和 React 基础的 web 开发者来说, Vue 会更友好,更符合他的思维模式。React 对于拥有函数式编程背景的开发者以及一些并不是以 web 为主要开发平台的开发人员而言,React 更容易接受。这并不意味着他们不能接受 Vue,Vue 和 React 之间的差异对他们来说就没有 web 开发者那么明显。可以说,Vue 更加注重 web 开发者的习惯

实现上,Vue 跟 React 的最大区别在于数据的 reactivity,就是反应式系统上。Vue提供反应式的数据,当数据改动时,界面就会自动更新,而 React 里面需要调用方法 SetState。我把两者分别称为 Push-basedPull-based。所谓 Push-based 就是说,改动数据之后,数据本身会把这个改动推送出去,告知渲染系统自动进行渲染。在 React 里面,它是一个 Pull 的形式,用户要给系统一个明确的信号说明现在需要重新渲染了,这个系统才会重新渲染。两者并没有绝对的优劣之分,更多的也是思维模式和开发习惯的不同。

两者不是完全互斥的,比如说在 React 里面,你也可以用一些第三方的库像 MobX 实现 Push-based 的系统,同时你也可以在 Vue2.0 里面,通过一些手段,比如把数据 freeze 起来,让数据不再具有反应式特点,或者通过手动调用组件更新的方法来做一个 pull-based 系统。所以两者并没有一个绝对的界限,只是默认的倾向性不同而已。

以上回答摘自图灵社区对尤雨溪的访谈:《以匠人的态度不断打磨完善Vue》

感觉尤大说得很中肯,虽然有些地方暂时看不明白在说啥,但还是有种恍然大悟豁然开朗如拨云雾而见青天的赶脚。

五、Flag

抽空对 React 进行一个系统的学习,从文档到小 demo,初步掌握其基本语法并使用它的全家桶完成一个实战项目。


  目录