Vue2依赖收集
2022-06-08 15:11:13 0 举报
Vue2依赖收集详细流程图
作者其他创作
大纲/内容
对于深度监听 的对象要递归去访问 value ,触发它所有⼦项的 getter
popTarget(),这个watcher的依赖收集完了,恢复Dep.target
mountComponent
pushTarget(this)
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) } }}
这个时候 Dep.target 已经被赋值为渲染 watcher ,那么就执⾏到 addDep
执⾏ dep.addSub(this) ,那么就会执⾏ this.subs.push(sub) ,也就是说把当前的 watcher 订阅到这个数据持有的 dep 的 subs中,这个⽬的是为后续数据变化时候能通知到哪些 subs 做准备
实例化渲染Watcher
Watcher的constructor调用this.get()
if (this.deep) { traverse(value)}
它会先执⾏ vm._render() ⽅法,因为之前分析过这个⽅法会⽣成 渲染 VNode,并且在这个过程中会对 vm 上的数据访问,这个时候就触发了数据对象的 getter
在initState时,defineReactive会给每个对象值的 getter 都new⼀个 dep ,在触发 getter 的时候会调⽤ dep.depend() ⽅法,也就会执⾏ Dep.target.addDep(this)
// The current target watcher being evaluated.// This is globally unique because only one watcher// can be evaluated at a time.Dep.target = nullexport function pushTarget (_target: Watcher) { if (Dep.target) targetStack.push(Dep.target) Dep.target = _target}Dep.target是全局唯一的,因为在一段时间内只会有一个Watcher被收集依赖实际上就是把 Dep.target 赋值为当前的渲染 watcher 并压栈(为了恢复⽤)。
Vue依赖收集过程
this.cleanupDeps()
调用$mount执行挂载
0 条评论
下一页