关于watcher的一点疑问
来源:4-6 依赖收集(下)

qq_飞越疯人院_1
2019-08-11
export function getData (data: Function, vm: Component): any {
pushTarget() // push一个undefined
try {
return data.call(vm, vm)
} catch (e) {
handleError(e, vm, `data()`)
return {}
} finally {
popTarget() // 又pop掉
}
}
为什么这里要有一对pushTarget
和popTarget
,再一个方法内放一个undefined
到数组内然后pop
掉?
还有就是渲染watcher
为什么要用数组栈来管理了?Dep.target
好像可以让它作为一个全局唯一变量,再执行某个组件的new Watcher
时就赋值,然后执行getter
内的_render()
时收集它,再执行子组件时又重新赋值收集当前的赋值。
写回答
1回答
-
注释写的很清楚了,所以可以找到对应的 issue: https://github.com/vuejs/vue/issues/7573
以及这次 commit:https://github.com/vuejs/vue/commit/318f29fcdf3372ff57a09be6d1dc595d14c92e70
另外为什么要用 targetStack 一个栈的结构来存储 Wather,是为了解决嵌套 Watcher 的情况,比如模板依赖了一个计算属性,计算属性又依赖了一个计算属性,确保每个 Watcher 的 getter 执行完后,能退回到正确的 Dep.target。212019-08-12
相似问题