当前位置: 首页 > news >正文

vue的响应式原理

vue2的响应式原理

  1. 属性描述符,也就是对对象的属性进行劫持
  • 通过 get收集依赖(收集使用该数据的组件),set 派发更新(通知依赖的组件重新渲染)

    • 依赖收集:每个组件实例对应一个 watcher对象,当组件渲染访问数据时,会触发属性的getter,将当前的watcher添加到依赖列表中(dep)
    • 派发更新: 当数据变化时触发setter,Dep会通知所关联的watcher重新计算从而触发组件重新渲染
  • 注意:数组的响应式 是通过重写数组的方法(push、pop、splice)来实现对数组变化的监听,因为这些方法无法通过 object.defineProperty直接监听的

Object.defineProperty(obj,'a',{
	value:10,
	writable:false,// 不可重写
	enumerable:false,// 不可遍历
	configurable:false,// 不可修改值本身
})

// vue 响应式简化版实现
function defineReactive(obj, key, val) {
  const dep = new Dep();
  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) { // Dep.target 是当前 Watcher
        dep.addSub(Dep.target); // 收集依赖
      }
      return val;
    },
    set(newVal) {
      val = newVal;
      dep.notify(); // 通知所有 Watcher 更新
    },
  });
}

vue3的响应式原理

  • vue 3 使用Proxy代替 Object.defineProperty, 解决了vue2的局限性,(如无法检查对象属性的新增和删除,数组索引的直接赋值等)提高了性能
    • Proxy he reflect 的区别

      • Proxy:可以拦截对象的整个操作(读写,增删)
      • reflect 只能操作对象
    • 响应式API : reactive 和 ref

      • reactive(obj):将普通对象转换为响应式对象(通过 Proxy 代理)
      • ref(value):将基本类型值包装为响应式对象(通过 .value 访问)
    • 依赖和收集

      • track: 再getter中追踪依赖(类似vue2的dep)
      • trigger: 在setter 中触发依赖
// 简化版实现
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      track(target, key); // 收集依赖
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return true;
    },
  });
}

‌Vue 2 vs. Vue 3 响应式对比

‌特性Vue 2 (Object.defineProperty)‌Vue 3 (Proxy)
对象属性监听需要遍历属性递归劫持直接代理整个对象
数组监听重写数组方法直接监听索引变化
新增/删除属性需手动调用 Vue.set/Vue.delete自动支持
性能递归劫持有性能损耗惰性劫持,按需触发

在这里插入图片描述

相关文章:

  • 尝试使用Tauri2+Django+React项目(2)
  • 精度与效率双突破!CASAIM 智能检测系统为制造装上“智慧之眼”
  • C语言入门教程100讲(4)输入输出
  • 【003安卓开发方案调研】之ReactNative技术开发安卓
  • 群晖导入磁盘大法 - 安装img
  • OAK相机入门(四):近距离深度图
  • 基于Windows11的Xinference安装方法简介
  • V2使用中遇到的问题
  • qemu ept设置过程
  • 三分钟掌握音频提取 | 在 Rust 中优雅地处理视频音频
  • 记录修复一个推拉门滑轮
  • 金仓KESV8R6任务调度
  • 使用 DeepSeek 训练定制化小说创作模型,所需本地数据量与模型规模、训练目标
  • 神经网络基础之正则化
  • 更改 vscode ! + table 默认生成的 html 初始化模板
  • 虚拟路由与单页应用(SPA):详解
  • 【Linux】Hadoop-3.4.1的伪分布式集群的初步配置
  • MiB和MB
  • 多层感知机
  • Java 输入1~100的整数,当读入负数时结束,统计输出每个数的数量
  • 被前男友泼汽油致残后,一个女孩经历的双重灼烧
  • 2025年中国网络文明大会将于6月10日在安徽合肥举办
  • 最新研究:新型合成小分子可“精准杀伤”癌细胞
  • 京东一季度净利增长五成,营收增速创近三年新高,称外卖业务取得显著进展
  • 在笔墨金石间,看胡问遂与梅舒适的艺术对话
  • 联合国秘书长欢迎中美经贸高层会谈成果