依赖

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

前端工程师666777888

2021-03-29

图片描述
在收集依赖时。name属性会收集到computed watcher
其中的render watcher是被name收集了,还是被cName收集了

我感觉是被cName收集了,因为这个render watcher是在执行cName的get方法时被收集的。但是通过调试,我看到这个render watcher却被name收集了???

写回答

1回答

ustbhuangyi

2021-03-29

name 也要收集 render watcher。 理由如果只有 computed watcher 被收集那么 name 触发 set只会通知 computed watcher 的 update而 computed watcher 由于 lazy 为 true所以只是把 dirty 设置为 true 
//img.mukewang.com/szimg/6061f75a09e61d6a10920838.jpg

但是我们知道实际上如果 name 发送改变触发 set整个组件会重新渲染那是为什么呢因为 name 也收集了 render watcher什么时候收集的呢注意看
//img.mukewang.com/szimg/6061f7a009facd0119801212.jpg
在 computed watcher 本身完成依赖收集后这个时候 Dep.target 又指回了 render watcher然后执行 computed watcher 的 depend 方法目的是让 computed watcher 的 dep 再次收集依赖

//img.mukewang.com/szimg/6061f802096cac1516420690.jpg

因为在每次 watcher 执行 get 计算完毕后都会执行 cleanUpDeps所以这里的 this.deps 实际上指向的就是 这个 computed watcher 的对应的 deps在这个场景就是 name 创建出来的 dep但是此时 Dep.target 已经是 render watcher那么就相当于让 name 收集了 render watcher。

1
4
前端工程师666777888
this是watcher实例
2021-04-08
共4条回复

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

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

4984 学习 · 1037 问题

查看课程