Vue的响应式原理

Vue版本:2.6.10

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值