dep
- 对每个data中属性进行监视/劫持前创建一个对应的dep对象
- dep 与 data 属性是一一对应关系, dep的个数就为data中的个数
watcher
- 解析模板中的表达式(事件指令除外)是创建对应的watcher对象
- watcher与表达式是一一对应关系, watcher的个数为模板中表达式的个数
watcher与dep之间的关系
- 1个watcher对应 n (>=1)个dep,如果是多层的表达式n>1, 1个watcher对应多个dep
- 1个dep对应 n(n>=0)个watcher,如果多个表达式用到当前属性 n>1 (1个dep对应多个watcher)
| dep |
|
关联的watcher属性 |
| name |
dep0 |
subs= [watcher1,watcher2] |
| wife |
dep1 |
subs= [watcher3] |
| wife.name |
dep2 |
subs= [watcher3] |
| wife.age |
dep3 |
subs= [] |
| watcher |
|
关联的dep属性 |
| name |
watcher1 |
depId= {0: dep0} |
| name |
watcher2 |
depId = {0: dep0} |
| wife.name |
watcher3 |
depId = {0: dep1, 1: dep2} |
订阅者
- 订阅数据变化, 作相应处理
- watcher:收到数据变化的通知后,更新相应节点
发布者
- 发布数据变化的消息
- observer(属性的setter)
- 将属性数据改变的消息通知给了订阅器
订阅器
- dep对象:存储所有相关的订阅者(watcher)
- 一旦收到数据变化的消息,通知所有相关的watcher(订阅者)
数据劫持: Object.defineProperty
数据双向绑定
- 建立在单向数据绑定的基础上
- 双向数据绑定的基本流程
- 在解析v-model指令时,给当前元素添加input监听
- 在input的value发生改变时, 将最新的值赋值给当前表达式所对应的data属性