-
Notifications
You must be signed in to change notification settings - Fork 5
Open
Description
DEMO:https://jsbin.com/hehicek/edit?html,console,output
TODO 正在热火朝天更新中,欢迎催更~
Vue.js 数据驱动 && 订阅发布模式原理
Vue实例初始化时收集订阅
- 基于
Watcher
,初始化时第一次调用updateComponent()
渲染出虚拟DOM:new Watcher(this, updateComponent)
Watcher
初始化时,constructor
中会调用一次Watcher
实例的回调this.get()
- 并将当前上下文的
Dep.target
设置为当前的Watcher
实例 - 运行过程中,会读取渲染所需的
data
每个属性的值,触发其defineProperty()
设置的getter
getter
中会调用dep.depend()
收集当前的Dep.target
作为订阅者,添加到dep
实例的subs
属性中
(this.subs.push(sub)
)- 最后,第一次调用
updateComponent
完成后,会卸载Dep.target
,设置为null
数据驱动发布更新视图
当数据更新后,例如执行:vm._data.msg = "数据驱动 DOM 更新”
- 会触发赋值属性对应的
defineProperty()
设置的setter
setter
中会调用dep.notify()
,遍历所有的订阅者(this.subs
),并调用订阅者的.update()
方法发布更新Watcher
的.update()
方法会再次调用其第二个参数回调函数,执行一次updateComponent
- 执行
updateComponent
,调用_render()
,渲染出新的虚拟DOM,经过Diff,同步到真实DOM中,就完成了一轮「数据驱动」的视图更新。
Metadata
Metadata
Assignees
Labels
No labels