Vue数据双向绑定原理 | 青训营笔记

60 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第24天

最近学习了一下关于Vue数据双向绑定原理的知识,特意记录一下

他的实现利用了Object.defineProperty,所以先来看看这个方法能干啥

Object.defineProperty

developer.mozilla.org/zh-CN/docs/…

利用Object.defineProperty第三个参数的属性描述符中的存取描述符对user设置getter和setter,让user对象中的age属性在被读取值或者被修改值时可以监听到读取或修改的操作,然后采取操作

下面就让user的age在被读取或修改时或输出一些信息来表示他被读取或修改了

image.png  

image.png

这样设置的属性颜色跟正常属性的颜色不太一样,但具体原因我不清楚

这是被访问时的情景gif,这里一开始user.age是 (…) 这样子应该是被Object.defineProperty监听才这样?

被访问了.gif

把它点开相当于是访问它了


现在知道Object.defineProperty能干啥了,他能给对象的属性设置getter和setter,让该属性在被访问或被修改的时候被监听到,这就为数据双向绑定提供了方便,这样可以在数据发生变化的时候做出处理

数据绑定

接下来实现一下vue的数据绑定,主要重点是数据绑定,一些地方的实现就略过的,实际上我也不会🤣

这里我们模仿new Vue的操作,传入el和data对象(在图里最底下)

我们要写一个模仿Vue的构造函数,这里是LcVue,构造其实例时传入一个选项对象,然后将其绑定到当前实例的属性上,

那怎么实现响应式数据呢? 这就要对传入的data进行一些改造,并且记录下依赖data的有关项,这样能在data发生变化时,让有关系的项也跟着变化

所以要遍历data的属性,对每一个属性都用Object.defineProperty进行改造, 把这些 属性(property) 全部转为 getter/setter。

这里像 编译模板,指令 和 处理订阅者的更新(那个update那里) 的实现就没有给出,一是跟数据绑定关系不大,二是我还不会

image.png