请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

依赖

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

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

正在回答 回答被采纳积分+3

1回答

ustbhuangyi 2021-03-29 23:56:32

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

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

https://img1.sycdn.imooc.com//szimg/6061f802096cac1516420690.jpg

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

1 回复 有任何疑惑可以回复我~
  • 谢谢。看到cleanUpDeps函数,我好像知道了
    回复 有任何疑惑可以回复我~ 2021-03-30 08:01:39
  • 执行this.deps[i].depend()。此时这个dep会再次收集依赖,现在的依赖是render watcher。所以nane属性收集到了render watcher
    
    这就是dep和wacher间来回调用的最好见证
    
    一般的收集依赖都是直接执行dep.depend()。此时的场景通过wacher间接调用
    回复 有任何疑惑可以回复我~ 2021-03-30 08:17:23
  • 是的,不过为啥我的回复中间的标点符号都没了。。
    回复 有任何疑惑可以回复我~ 2021-03-31 23:34:25
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信