Vue的基本原理,双向数据绑定的原理,Vue的响应式原理,Vue是如何收集依赖的区别?

200 阅读2分钟

Vue的基本原理

image.png

当一个Vue实例创建时,Vue会遍历data中的属性,用 Object.defineProperty(vue3.0使用proxy )将它们转为 getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。 每个组件实例都有相应的 watcher 程序实例,它会在组件渲染的过程中把属性记录为依赖 ,之后当依赖项的setter被调用时,会通知watcher重新计算,从而致使它关联的组件得以更新。

双向数据绑定的原理

MVVM作为数据绑定的入口,整合Observer、Compile和 Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据model变更的双向绑定效果。

image.png

Vue的响应式原理

Vue响应原理的核心是数据劫持和依赖收集,主要是利用Object.defineProperty()实现对数据存取操作的拦截,我们把这个实现称为数据代理;同时通过对数据getter函数的执行,可以获取到对数据的依赖,并将所有的依赖收集到一个集合中;修改属性或值时,会触发这里定义的setter函数,函数中会去通知集合中的依赖更新,做到数据变更驱动视图变更。

双向数据绑定通常是指我们使用的v-model指令的实现,是Vue的一个特性,也可以说是一个input事件和value的语法糖。 Vue通过v-model指令为组件添加上input事件处理和value属性的赋值。

Vue是如何收集依赖

在初始化 Vue 的每个组件时,会对组件的 data 进行初始化,就会将由普通对象变成响应式对象,然后在 get 函数中通过 dep进行依赖收集。Dep是整个依赖收集的核心,

Dep是一个class,其中有一个关键的静态属性 static,它指向了一个全局唯一 Watcher,保证了同一时间全局只有一个 watcher 被计算,另一个属性 subs 则是一个 Watcher 的数组,Dep 实际上就是对 Watcher 的管理。

过程:

初始化状态,这中间便会将数据变成响应式对象,会触发数据对象的getter,每个对象值的getter都持有一个dep,在触发getter的时候会调用dep中的方法,dep就会通过静态属性找到watcher,将对象存储在water的数组中,完成依赖的收集。getter会执行vm._render() 方法,在渲染时将属性转换成依赖。