图解 Vue1.0 响应式系统
jQuery 和 Vue
jQuery
Vue
Vue 是如何知道更新哪里?
Vue 是如何知道何时该更新?
这就是 Vue 一个核心的概念:响应式系统。如下是Vue 1.0 的官方响应式图:
其实官网的图是一个简化版的,只是为了使用者大概知道原理,但是对于研究源码还不够丰富,下面是我自己补充的图:
得益于 Vue 的响应式系统,才实现上面两个功能,那 Vue 到底是如何实现的呢?Vue 是结合了 Object.defineProperty 和 发布订阅模式 来实现响应式系统的。
Object.defineProperty:
The static method Object.defineProperty() defines a new property directly on an object, or modifies an existing property on an object, and returns the object.
在对象上添加新属性或修改已存在属性,并返回传入的对象。
语法:
重点是 descriptor:
实例:
在浏览器控制台输入:obj.name = 'lisi',结果如下:
Vue 中的源码分析
Vue 暴露的构造函数
new Vue 的时候就是调用上面,实际执行的是里面的 this._init() 方法,源码如下(主要部分):
this._initState:
this._initData:
observe:
Observer:
this.observeArray 和 this.walk 都会走到 defineReactive 方法源码如下:
Dep.target 就是 watcher,在每次 watcher 求值之前,会把当前的 watcher 赋值给 Dep.target,求值触发了 get 方法则会把当前的 watcher 给收集到 Dep 的 subs 中,这里就回答了 Vue 是如何知道更新哪里的问题,等到重新赋值时触发 set 方法执行 dep.notify() 通知更新,这里就回答了 Vue 是如何知道何时该更新的问题 ,源码如下:
这里其实就是调用 watcher 的 update 方法,通知更新:
这里的 run 方法是重点:
this.cb 就是指令的更新方法,到此跟新动作完成。
如有不对,请斧正!😁
版权声明: 本文为 InfoQ 作者【前端黑板报】的原创文章。
原文链接:【http://xie.infoq.cn/article/af5c66a84319dcbfd567103f4】。文章转载请联系作者。
评论