DMQ / mvvm

剖析vue实现原理,自己动手实现mvvm
5.21k stars 1.26k forks source link

计算属性如何与属性建立依赖关系 #22

Closed Pzhicong closed 6 years ago

Pzhicong commented 6 years ago

属性变量变化是怎样触发计算属性变化的,这块没看明白,请教下

DMQ commented 6 years ago

computed属性在初始化取值的时候,如果里面包含了data属性的值,也会触发data属性的getter,就会把computed属性的watcher添加到data属性的dep里面,比如:

data: {
    name: 'foo'
},

computed: {
   sayHi() {
        return 'hello ' + this.name
   }
}

<div>
    {{sayHi}}
</div>

// 在解析模板的时候,发现sayHi这个computed属性有绑定dom,就会new 一个 watcher
// Dep.target = 此时的watcher实例,new Watcher的过程中回去执行 sayHi() 取值,会触发 data.name 的getter
// 就会把 Dep.target 添加到 data.name 的 dep队列里面
// 所以,实际上,dom是和 data.name 做了动态绑定。取data.name有变化的时候(注意不是sayHi有变化)
// 会通知调用sayHi来取值后,更新到dom上
Pzhicong commented 6 years ago

明白了,感谢 @DMQ