Appearance
Vue响应式原理(双向数据绑定)
简单版
Vue 在创建实例时,会遍历data选项的属性,利用object.defineProeprty
为属性添加setter和getter。getter用来依赖收集,setter用来派发更新,并且在内部追踪依赖,在属性被访问和修改时通知变化。
详解版
在创建Vue实例时,会遍历data
的属性,并且对每个属性调用defineReactive
函数。defineReactive
函数的作用就是定义一个响应式对象,给对象添加getter
和setter
。在defineReactive
函数中,会创建一个dep
实例。Dep
类就是利用Set
去做存储,在depend
的时候把Dep.target
加入到deps
里,在notify
的时候遍历deps
,触发每个watcher
的update
。
当执行一个watcher
时,会先将该watcher
中的渲染函数保存起来。然后将这个存储了渲染函数的watcher
设置为Dep.target
,然后执行渲染函数。
在执行渲染函数的过程中,读取到了value值,就会触发其getter
,getter
函数中执行dep.depend
,将Dep.target
加入到value
的deps
里。
当修改value
的值时,就会触发其setter
,setter
函数会执行dep.notify
,会遍历deps
,执行每一个watcher
的update