美文网首页
vue源码赏析五(Observe+Dep+Watcher)

vue源码赏析五(Observe+Dep+Watcher)

作者: 梦行乌托邦 | 来源:发表于2020-06-23 10:09 被阅读0次

Dep.target是在哪里赋值的?

src/platforms/web/runtime/index.js

img1
Vue原型的$mount方法调用了mountComponent方法(src/core/instance/lifecycle.js
img2
这里new了一个Watcher的实例,看看Watch类(src/core/observe/watcher
img3
构造函数调用了get方法,在get方法中调用了 pushTarget(this)
img4
这里便将Watcher的实例(当前渲染的)赋值给了Dep.target


那么是何时调用的$mount呢?
initMixinsrc/core/instance/init.js
img5
Vue构造函数的最后一步调用$mount进行挂载。

Observer: 将数据定义为响应式,每个Observer实例都有自己的Dep来管理依赖。实例化Watcher的时候进行求值会触发getter,进而执行dep.depend()将当前Watcher加入Dep维护的依赖列表,这就是依赖收集的过程。
数据发生变化触发setter执行def.notify,Dep会执行所有依赖的update方法并加入异步更新队列,这就是触发依赖过程

Dep:依赖管理者,其实例属性subs即为依赖者列表(Watcher)

Watcher:依赖者(订阅者),在Vue构造函数的最后一步挂载操作($mount)中被实例化,实例化时会执行 get 方法对传入的 updateComponent 进行求值,updateComponent 也就是 _render 函数,执行 _render 函数会读取 data 数据从而触发 getter 进行依赖收集。

参考资料:

https://juejin.im/post/5e83ed516fb9a03c550fcdb7

相关文章

网友评论

      本文标题:vue源码赏析五(Observe+Dep+Watcher)

      本文链接:https://www.haomeiwen.com/subject/qdkqfktx.html