Vue 源码 模拟Vue2 实现数据劫持Observer 以及数据修改更新视图

定义一个Observer类,将数据传进去监听

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一个个取出来,

给data里面的每个之进行监听

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建一个Wathcer类,用来创建监听者

在这里插入图片描述
每个watcher都有一个update方法,方便调用取修改数据。

创建一个Dep类 收集所有依赖者,创建Observer与Watcher的联系。在这里插入图片描述

一开始Complie更新视图的时候,我们就必须相对应的创建一个watcher,接着,通过watcher里面调用data的值,去调用了get函数,这时候我们在get函数里面,通过Dep.target去获取这个watcher并且把它加入到subs里面。先看代码在这里插入图片描述

new Watch了,会走到watcher的构造函数在这里插入图片描述
里面我们会获取data里面的值,所以我们先给Dep类加一个属性,使其指向当前的watcher,在获取数据时,就会调用get函数在这里插入图片描述
就在这里趁机将wathcer加入到subs里面,然后再将Dep.target指向空。否则每次都会加一个进去。
这样就实现增加watcher。
接着修改值的时候,会调用set函数,通过dep.notify()去调用每个watcher的update方法,进而去修改值。在这里插入图片描述
这样就实现了数据更新操作。在这里插入图片描述
在这里插入图片描述
对test的处理
在这里插入图片描述
因为返回来的值并不是我们想要的,所以我们不用返回来的值,自己再创建一个函数,去调去data里面的值,因为这时候是回调函数了,就证明值已经更新过了,在调用data数据的get函数是会取到最新值的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过事件更新数据也完成了。

总结:1 监听者,创建一个Observer类,将数据传进去,利用Object.keys去获取属性,如果属性是对象,还必须继续递归获取。接着通过Object.defineproperty的get和set去给监听data里面的每个属性的值。set监听数据改变,get返回改变后的值,以此达到数据监听。

2 修改数据 第一次更新视图的时候对应的每个处理如text,html,model的处理,就应该创建一个wathcer对象,接着wathcer对象的构造函数会获取旧值,此时就会调用get函数,在get函数做判断将watcher加入Dep类,实现加入监听者。更改数据的时候,调用set函数,在set函数调用dep.notify()函数,让监听者去获取新值作比较,若不同,就调用一开始创建watcher的回调函数,去修改视图,达到试图更新。

精髓就在object.defineproperty方法中的set,get实现对每个属性的监听与更改。

get函数在一开始视图渲染时就会调用。set函数是监听数据变化的,只有当数据变化才会调用。

猜你喜欢

转载自blog.csdn.net/lin_fightin/article/details/110733271