var vm = new Vue({
el: '#example',
data: {
a: 1
},
computed: {
// a computed getter
b: function () {
// `this` points to the vm instance
return this.a + 1
}
}
})
b是怎么知道它要依赖a的?
迷茫2017-04-10 16:47:31
Vue 中的计算属性是由 lazy watcher 实现的,而 watcher 的依赖关系是由依赖收集(dependency collection)确定的。
Vue 实例初始化过程中,将所有计算属性包装为 lazy watcher;
首次访问计算属性时,watcher 为 dirty,此时开始计算此 watcher 的值;
计算开始之前,此 watcher 将被设置为依赖目标,开始依赖收集(相关代码);
计算 watcher 值的过程中,被访问到属性的 getter 中会是检查是否存在依赖目标,若存在依赖目标就创建依赖关系(相关代码);
watcher 的值计算完成后,新的依赖将被设置,旧的依赖会被删除,依赖收集完成。
当依赖属性更新时,会通知自身的依赖目标,watcher 被设置为 dirty(相关代码);
再次访问该计算属性,重复计算及依赖收集步骤(3-6)。