相关文章网上已经很多了,趁 3.0 没出跟风打个卡
前言
本文只做简单介绍,结合代码食用更佳:github/vue-learn-source-code
效果预览:github pages
Object.defineProperty
defineProperty 让我们可以劫持某个属性的 getter 和 setter,举个例子:
|
|
劫持 fullName 后,改变 firstName 或 lastName 会更新 fullName,反之亦然
目标
本文的目标是仿造 vue 实现改变数据后更新 dom,让以下代码能够 work:
观察者模式
我们要做的是数据变化后去更新 dom,观察者模式很适合
数据只需要收集依赖,当数据变化通知依赖更新即可,先建一个类描述这件事:
|
|
再细想一下,dom 依赖 data,则在获取 dom 的过程中需要用到 data 的 get,在 data get 时收集依赖即可,set data 时执行 dom 的 update
get data 时需要记录依赖 data 的数据,给 class Dep 增加一个属性 target 作为记录工具,结合 defineProperty 实现如下:
|
|
工具已备齐,接下来就是遍历 data 的属性,用 defineReactive 走一遍
data, computed, dom 的依赖关系
解析 dom 会用到 data 和 computed,computed 的 get 会用到 data
- 遍历 data
|
|
- 遍历 computed
|
|
- 解析 dom
|
|
多说一句
在收集依赖时,我们给 Dep 这个 class 增加一个属性 target,在 vue 中还结合了 targetStack。这种收集方式稍微管理不慎就可能存在 bug,在另一篇文章有提过:熟悉 Vue ?你能解释这个死循环吗?。
为自己的填坑喝彩~