《深入浅出Vue.js》Object变化侦测读书笔记
《深入浅出Vue.js》的作者刘博文是参考2.5.2版本进行撰写的,因此我下载相同版本进行学习2.5.2版本下载
1.基本概念
响应式系统...
响应式系统是通过改变数据模型实现视图的更新。它的核心是变化侦测。
侦测到数据的变化,通知视图进行更新和渲染。
状态作为输入,并生成DOM输出到页面上显示出来的这个过程。
2.Object变化侦测的原理
一个状态绑定多个依赖,当状态发生变化时,通知绑定的依赖更新。
可以是javaScript的任何类型。状态最终可能会以段落、表单、链接、按钮等元素的形式呈现在页面上。
依赖是使用数据的地方,比如模板、watch等。
特别注意,因为依赖有很多类型,我们可以在数据和依赖中间加一个观察者角色Watcher。它的作用就像商家和顾客中间的快递员。商家要发货给顾客,因为顾客很多,商家把货物丢给快递员就行,然后快递员自己看着办。
第一步找到存储Watcher的容器。第二步把Watcher放进去。
我们使用数组进行收集,给数组取名为subs。
我们使用Object.defineProperty,重写属性的get方法,在getter中收集依赖,只要有地方获取值触发getter,就可以自动收集依赖。每个属性配备一个subs。
同样我们使用Object.defineProperty,重写属性的set方法, 当setter被触发时,我们循环该状态的subs,通知里面的每一个Watcher,由Watcher通知依赖更新。
Observe类,递归侦测所有属性。

- 运行结果

执行
let observer = new Observer(data)
console.log("侦测对象data:", observer)

执行
new Watcher(data, 'person.name', function (val, newVal) {
console.log("Watcher回调")
})

当触发person.name的getter函数,我们会发现Dep的subs中新增了一个Watcher对象,而Watcher对象中有depIds和deps记录自己会被哪些Dep通知。
由于获取person.name值时,会触发person的getter函数和name的getter函数,因此我们会看到控制台打印了两条数据,两个dep的id不同,subs里面存储了同一个Watcher对象,Watcher对象的deps里记录它可以被id为0和id为1的对象通知到。
执行
data.person.name = {
firstName: 'hongan',
lastName: 'Zhang',
newName:'111'
}

修改name的值,id为1的dep存储的Watcher被通知
《深入浅出Vue.js》Object变化侦测读书笔记
《深入浅出Vue.js》的作者刘博文是参考2.5.2版本进行撰写的,因此我下载相同版本进行学习2.5.2版本下载
1.基本概念
2.Object变化侦测的原理
2.4 Object的变化侦测demo