这里关于dep和watcher

来源:4-5 依赖收集(上)

MeSKiL

2019-10-30

这里其实是一个watcher上记录(newDeps)自己监听的dep,dep存放(subs)监听自己的watchers。
也就是说触发了getter之后,watcher上就会记录这个dep是被自己监听的。dep上也会记录这个watcher是监听自己的。

 addDep (dep: Dep) {
    const id = dep.id
    if (!this.newDepIds.has(id)) {
      
      this.newDepIds.add(id)
      this.newDeps.push(dep)
       // 如果newDepsId里没有,就再这个watcher的newDeps里记录这个dep
       
      if (!this.depIds.has(id)) {
      // 就说明这个watcher这次应该在dep里但是上次不在dep的监听里,所以要给dep添上这个watcher
       
        dep.addSub(this)
      }
    }
  }

是这样的嘛,我觉得他这个绕就是绕在他是一个双向的过程,有就一起有,没有就一起没有,清空的时候,如果这个watcher不监听某个dep了,那在dep里也要清除相应的watcher

写回答

1回答

ustbhuangyi

2019-10-31

watcher 和 dep 是互相持有的关系,可以理解成一个多对多的关系,在定义响应式对象的时候会创建 dep,在对象被访问触发 getter 的时候就会触发 dep.depend 做依赖收集,作为依赖收集到当前正在计算的 watcher 中,这个 watcher 可以是 render watcher,可以是 computed watcher,也可以是 user watcher。

watcher 内部维护了 deps 和 newDeps 也是为了可以让 watcher 可以在每次计算完成清空不需要要的 dep 依赖了。 

0
1
MeSKiL
非常感谢!
2019-10-31
共1条回复

Vue.js 源码深入解析 深入理解Vue实现原理

全方位讲解 Vue.js 源码,进阶高级工程师

4984 学习 · 1037 问题

查看课程