Dep.target是在哪里赋值的?
src/platforms/web/runtime/index.js

Vue原型的$mount方法调用了mountComponent方法(src/core/instance/lifecycle.js)

这里new了一个Watcher的实例,看看Watch类(src/core/observe/watcher)

构造函数调用了get方法,在get方法中调用了 pushTarget(this)

这里便将Watcher的实例(当前渲染的)赋值给了Dep.target
那么是何时调用的$mount呢?
initMixin(src/core/instance/init.js)

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 进行依赖收集。
参考资料:
网友评论