2020-11-06 vue clearnupDeps的作用以及对依赖收集的细节上理解

参考资料:
https://blog.csdn.net/qq_37939251/article/details/90683466
https://blog.csdn.net/afk46847/article/details/101509059(主要是这篇)

依赖收集(源码级理解)

当创建watcher的时候,会触发watcher.get方法
watcher.get方法如下
get () {
pushTarget(this)
let value
const vm = this.vm
try {
value = this.getter.call(vm, vm)
} catch (e) {
// 省略...
} finally {
// 省略...
popTarget()
this.cleanupDeps()
}
return value
}
get方法中会去调用watcher.getter方法【value = this.getter.call(vm, vm)】
对于computedWatcher来说是computed中属性的表达式

对于renderWatcher来说watcher.getter方法是updateComponent,
这个方法会生成renderFunction,然后将renderFunction生成vnode
生成vnode的过程中会获取data中属性的值,进而会触发data中数据的getter方法,getter方法会触发依赖收集
dep的depend方法如下:(Dep.target是当前的watcher)
depend () {
if (Dep.target) {
Dep.target.addDep(this)
}
}
watcher的addDep方法如下
addDep (dep: Dep) {
const id = dep.id
if (!this.newDepIds.has(id)) {
this.newDepIds.add(id)
this.newDeps.push(dep)
if (!this.depIds.has(id)) {
dep.addSub(this)
}
}
}
addDep方法将当前watcher中没有收集的dep收集到当前watcher中【进行了去重】,
因为dep中会保留上一次依赖的watcher,将上一次没有的watcher收集到dep中

watcher.cleanupDeps()方法用于设置deps和newDeps的状态

例子
<div>{{a}} {{b}}</div> 对应一个renderWatcher
data: {
a: 1, -> 对应dep(a)
b: 2 -> 对应dep(b)
}
第一次页面初始化后,首先是
renderWatcher dep(a) dep(b)
deps newDeps
[] [dep(a), dep(b)] [renderWatcher] [renderWatcher]
然后执行了watcher.clearnupDeps
[dep(a), dep(b)] [] [renderWatcher] [renderWatcher]

当修改b的值时候
[[dep(a), dep(b)] [dep(b)] [renderWatcher] [renderWatcher]
执行了watcher.clearnupDeps之后
[dep(b)] [] [renderWatcher] [renderWatcher]

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Vue.js面试题整理 一、什么是MVVM? MVVM是Model-View-ViewModel的缩写。MVVM是...
    夏_fab2阅读 7,721评论 1 4
  • Vue.js面试题整理 一、什么是****MVVM****? MVVM是Model-View-ViewModel的...
    EmilWong阅读 269评论 0 0
  • 依赖收集通过上一节的分析我们了解 Vue 会把普通对象变成响应式对象,响应式对象 getter 相关的逻辑就是做依...
    小马嗒阅读 573评论 0 0
  • 渐变的面目拼图要我怎么拼? 我是疲乏了还是投降了? 不是不允许自己坠落, 我没有滴水不进的保护膜。 就是害怕变得面...
    闷热当乘凉阅读 4,350评论 0 13
  • 感觉自己有点神经衰弱,总是觉得手机响了;屋外有人走过;每次妈妈不声不响的进房间突然跟我说话,我都会被吓得半死!一整...
    章鱼的拥抱阅读 2,211评论 4 5