Vue 的响应式原理概述

1. 侦测数据的变化(数据劫持 / 数据代理)
– Vue2.0——Object.defineProperty()
- 无法检测到对象属性的添加或删除
- 无法监听数组的变化,需要进行数组方法的重写
– Vue3.0——Proxy
- 直接代理整个对象,不需要遍历对象的每个属性
- 支持代理数组的变化
2. 收集视图依赖了哪些数据(依赖收集)

  • 在getter中收集依赖,在setter中触发依赖,
  • 将观察者Watcher对象存放到当前闭包中的订阅者Dep的subs中。

3. 数据变化时,自动“通知”需要更新的视图部分,并进行更新(发布订阅模式)
         当对象的值变化的时候,会触发对应的setter,setter通知之前依赖收集得到的Dep中的每一个watcher,告诉他们自己的值改变了,需要重新渲染视图,这时候Watcher就会开始调用update来更新视图。

在 Vue 中会把传入的 data 转换成 Observer 对象,Observer 接收的对象可能是数组,或纯对象。

  1. 纯对象情况
    1. 如果是纯对象, 则遍历这个对象,通过 Object.defineProperty 拦截对成员的遍历
    2. 并且为每一个成员创建一个 Dep, 每个成员在被读取的时候会收集当前的 watcher
    3. 【注释】watcher 分为三种
      1. render watcher, Dep 收集到这个 watcher 后,调用 notify 会更新当前组件
      2. computed watcher, vm 在
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值