vue数据双向绑定原理

340 阅读2分钟

vue实例化过程

1. initData方法:在vue初始化的时候,会执行initData()方法,它会初始化data、props等属性,initData方法的核心功能就是将data数据实现响应化  =>  src\core\instance\state.js 

2. observe方法返回一个Observe实例,Observe对象能根据数据类型执行对应的响应化操作(数组observArray、对象walk)  =>  core/observer/index.js

observe  响应式的核心逻辑,函数observe的作用就是让传入的整个对象变成响应式的,它会递归遍历对象的所有属性,然后执行defineReactive

defineReactive就是定义响应式数据的核心函数

  • 新建一个 dep 对象,与当前数据对应
  • 通过 Object.defineProperty() 重新定义对象属性,配置属性的 set、get,从而数据被获取、设置时可以执行 Vue 的代码


defineReactive定义了对象属性的getter/setter,getter负责添加依赖,setter负责通知更新,建立属性key、dep和watcher的关系

3. Dep负责管理一组Watcher,包括watcher的增删以及通知更新  =>  core/observer/dep.js

4. Watcher

用户编写的watcher:会解析一个表达式并手机依赖,当数值变化时,触发其回调函数,常用于$watch API和指令中

组件watcher:每个组件都有其对应的Watcher,当数值发生改变时,会触发其update函数重新render渲染


数组

数组变化的侦测和对象的不同,我们操作数组通常使用push,pop,splice等方法,即为数组原型中7个可以改变内容的方法定义拦截,vue采用拦截这些默认方法来通知dep    =>   src\core\observer\array.js


总结:在vue中,data通过Observe类转化成getter/setter的形式来追踪变化,当外界读取数据时,会触发getter从而将watcher添加到dep依赖中,当数据发生改变时,会触发setter,从而向dep中的watcher发送通知,watcher接受到通知后,会触发重新render当前组件,然后生成虚拟dom树,Vue框架会遍历对比新旧虚拟dom树中每个节点的差异,并记录下来(打补丁),最后update将虚拟dom转为真实dom渲染到页面