vue的数据绑定

184 阅读1分钟

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)

  • 如图 ,watcher与dep
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

数据双向绑定

  • 建立在单向数据绑定的基础上
  • 双向数据绑定的基本流程
    1. 在解析v-model指令时,给当前元素添加input监听
    2. 在input的value发生改变时, 将最新的值赋值给当前表达式所对应的data属性