Skip to content
On this page

Vue响应式原理(双向数据绑定)

简单版

Vue 在创建实例时,会遍历data选项的属性,利用object.defineProeprty 为属性添加setter和getter。getter用来依赖收集,setter用来派发更新,并且在内部追踪依赖,在属性被访问和修改时通知变化。

详解版

在创建Vue实例时,会遍历data的属性,并且对每个属性调用defineReactive函数。defineReactive函数的作用就是定义一个响应式对象,给对象添加gettersetter。在defineReactive函数中,会创建一个dep实例。Dep类就是利用Set去做存储,在depend的时候把Dep.target加入到deps里,在notify的时候遍历deps,触发每个watcherupdate

当执行一个watcher时,会先将该watcher中的渲染函数保存起来。然后将这个存储了渲染函数的watcher设置为Dep.target,然后执行渲染函数。

在执行渲染函数的过程中,读取到了value值,就会触发其gettergetter函数中执行dep.depend,将Dep.target加入到valuedeps里。

当修改value的值时,就会触发其settersetter函数会执行dep.notify,会遍历deps,执行每一个watcherupdate