关于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掉
  }
}

为什么这里要有一对pushTargetpopTarget,再一个方法内放一个undefined到数组内然后pop掉?

还有就是渲染watcher为什么要用数组栈来管理了?Dep.target好像可以让它作为一个全局唯一变量,再执行某个组件的new Watcher时就赋值,然后执行getter内的_render()时收集它,再执行子组件时又重新赋值收集当前的赋值。

写回答

1回答

ustbhuangyi

2019-08-12

//img.mukewang.com/szimg/5d50c8ea09c7953115700596.jpg
注释写的很清楚了,所以可以找到对应的 issue: https://github.com/vuejs/vue/issues/7573

以及这次 commit:https://github.com/vuejs/vue/commit/318f29fcdf3372ff57a09be6d1dc595d14c92e70


另外为什么要用 targetStack 一个栈的结构来存储 Wather,是为了解决嵌套 Watcher 的情况,比如模板依赖了一个计算属性,计算属性又依赖了一个计算属性,确保每个 Watcher 的 getter 执行完后,能退回到正确的 Dep.target。

2
1
qq_飞越疯人院_1
以后还得学着去看issues, 栈那没有想到计算属性这个场景
2019-08-12
共1条回复

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

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

4984 学习 · 1037 问题

查看课程