Skip to content

《深入浅出Vue.js》第一篇变化侦测读书笔记 #2

Description

@Irene200825

《深入浅出Vue.js》Object变化侦测读书笔记

《深入浅出Vue.js》的作者刘博文是参考2.5.2版本进行撰写的,因此我下载相同版本进行学习2.5.2版本下载

1.基本概念

  • Vue.js的特性?

响应式系统...

  • 响应式系统是什么?

响应式系统是通过改变数据模型实现视图的更新。它的核心是变化侦测。

  • 变化侦测作用是什么?

侦测到数据的变化,通知视图进行更新和渲染。

  • 渲染是什么?

状态作为输入,并生成DOM输出到页面上显示出来的这个过程。

2.Object变化侦测的原理

  • Vue.js变化侦测的原理是什么?

一个状态绑定多个依赖,当状态发生变化时,通知绑定的依赖更新。

  • 状态是什么?

可以是javaScript的任何类型。状态最终可能会以段落、表单、链接、按钮等元素的形式呈现在页面上。

  • 依赖是什么?

依赖是使用数据的地方,比如模板、watch等。

特别注意,因为依赖有很多类型,我们可以在数据和依赖中间加一个观察者角色Watcher。它的作用就像商家和顾客中间的快递员。商家要发货给顾客,因为顾客很多,商家把货物丢给快递员就行,然后快递员自己看着办。

  • data怎么绑定Watcher?

第一步找到存储Watcher的容器。第二步把Watcher放进去。

  • 收集Watcher的容器是什么?

我们使用数组进行收集,给数组取名为subs。

  • Watcher怎么放进去?

我们使用Object.defineProperty,重写属性的get方法,在getter中收集依赖,只要有地方获取值触发getter,就可以自动收集依赖。每个属性配备一个subs。

  • 当数据发生变化时,怎么通知依赖更新?

同样我们使用Object.defineProperty,重写属性的set方法, 当setter被触发时,我们循环该状态的subs,通知里面的每一个Watcher,由Watcher通知依赖更新。

  • 怎么侦测到数据的所有属性?

Observe类,递归侦测所有属性。

  • 能整一个流程图吗?

屏幕快照 2020-08-27 上午11 02 31

2.4 Object的变化侦测demo

  • 运行结果
    屏幕快照 2020-08-29 下午4 29 30
执行
let observer = new Observer(data)
console.log("侦测对象data:", observer)

屏幕快照 2020-08-29 下午3 37 40

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

屏幕快照 2020-08-29 下午5 13 19

当触发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'
}

屏幕快照 2020-08-29 下午5 50 12

修改name的值,id为1的dep存储的Watcher被通知

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions