Vue版本:2.6.10
- 入口_init()中:
- 调用initState()初始化Vue实例状态
- 调用initData()将data属性注入到Vue实例上
- 调用observe()将data属性转化为响应式对象,observe是响应式的入口
- observe(value):(src/core/observer/index.js)
if(value不是对象){
return
}else if(value有__ob__属性){
return//已是响应式对象,无需响应式处理
}else{
为其创建observer对象
return 创建的observer对象
}
- Observe类(src/core/observer/index.js)
- 定义不可枚举的__ob__属性用来标记当前Observer对象
- 如果value是对象的话,会调用walk(),遍历对象中的每一个属性,对该属性调用defineReactive()
- 数组的响应式处理:
- 设置数组的push、pop、sort等方法。在调用这些方法时会发送通知,找到Observer对象中的dep,然后调用dep.notify()
- 遍历数组中的每一个成员,对其调用observe(value)
- defineReactive()(src/core/observer/index.js)
- 为每一个属性创建dep,用来收集依赖
- 如果属性是对象,则递归地要用observe(),将该对象属性也响应式处理
- 定义getter():收集依赖;若该属性为对象则为该对象的每个属性收集依赖,getter()最终返回该属性
- 定义setter():保存新值,若新值为对象则调用observe(),最终调用dep.notify()派发通知更新
- 收集依赖
- 调用watcher对象的get(),在其中调用pushTarget(),将当前watcher对象记录到Dep.target属性中
- 然后在访问data中的成员的时候收集依赖,就是在defineReactive()中定义的getter()中
- 将属性对应的watcher对象添加到dep的subs数组中
- 若属性是对象,则给childOb手机依赖,以便在子对象添加或删除成员时发送通知(数组中内容变化时用到了childOb)
- Watcher类,当数据发生变化时:
- dep.notify()时:调用Watcher对象的updata(),其中调用:
- queueWatcher()判断watcher是否被处理:没有则添加到queue队列中,并调用在flushSchedulerQueue():
- 触发beforeUpdate()钩子函数
- 调用watcher.run():run()–>get()–>getter()–>updataComponent()(该过程是针对渲染watcher,该过程之后页面就可看到更新后的数据了)
- 清理工作:清空上一次的依赖;重置watcher的状态
- actived()钩子函数
- 触发update()钩子函数
- queueWatcher()判断watcher是否被处理:没有则添加到queue队列中,并调用在flushSchedulerQueue():
- dep.notify()时:调用Watcher对象的updata(),其中调用: