Vue3相应式原理

铁佛  金牌会员 | 2024-11-24 17:42:12 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 823|帖子 823|积分 2469

Vue 3 的相应式体系基于 Proxy 对象实现,具有更高的性能和灵活性,相比 Vue 2 使用的 Object.defineProperty 有明显的改进。以下是 Vue 3 相应式原理的关键部分:

1. 焦点机制

Vue 3 相应式体系的焦点是 reactive API,它使用 Proxy 拦截对对象的访问和修改,从而实现数据的追踪和更新。
1.1 reactive 的实现

  1. import { reactive } from 'vue';
  2. const state = reactive({
  3.   count: 0,
  4.   info: {
  5.     name: 'Vue',
  6.     version: 3
  7.   }
  8. });
复制代码
在上述代码中:


  • reactive 会将传入的普通对象转换为相应式对象。
  • Vue 通过 Proxy 拦截对对象的利用(如 get、set),从而实现依赖网络和变革关照。

1.2 依赖网络与追踪

相应式体系的工作过程可以分为以下几步:

  • 依赖网络:当某个相应式属性被访问时,Vue 会记载哪个组件或函数依赖了该属性。
  • 触发更新:当相应式属性的值发生变革时,Vue 关照全部依赖该属性的函数重新执行。
依赖网络是通过 Effect 函数 实现的:
  1. import { effect } from 'vue';
  2. effect(() => {
  3.   console.log(state.count);
  4. });
复制代码
在执行 effect 时,Vue 会自动订阅 state.count,因此当 state.count 的值发生变革时,该 effect 会重新运行。

2. Proxy 的焦点拦截点

Vue 3 的相应式体系通过 Proxy 提供的拦截机制,完成以下利用:
2.1 get:读取属性

当访问对象的属性时,Vue 会触发 get 拦截器,从而完成依赖网络:
  1. const handler = {
  2.   get(target, key, receiver) {
  3.     const result = Reflect.get(target, key, receiver);
  4.     console.log(`读取属性 ${key}: ${result}`);
  5.     return result;
  6.   }
  7. };
复制代码
2.2 set:修改属性

当修改对象的属性时,Vue 会触发 set 拦截器,从而关照依赖更新:
  1. const handler = {
  2.   set(target, key, value, receiver) {
  3.     const result = Reflect.set(target, key, value, receiver);
  4.     console.log(`设置属性 ${key}: ${value}`);
  5.     // 触发依赖更新
  6.     return result;
  7.   }
  8. };
复制代码
2.3 track 和 trigger

Vue 3 将依赖追踪和触发分成了两个步骤:


  • track:在 get 中调用,用于记载依赖。
  • trigger:在 set 中调用,用于关照依赖更新。

3. 相应式工具

Vue 3 提供了一些内置工具和方法,资助开发者处理相应式对象。
3.1 reactive 和 ref



  • reactive:将对象或数组转换为相应式对象。
  • ref:用于包装单个值,使其具有相应式能力。
  1. import { ref } from 'vue';
  2. const count = ref(0);
  3. effect(() => {
  4.   console.log(count.value); // 监听 count 的变化
  5. });
  6. count.value++; // 触发更新
复制代码
3.2 computed



  • computed 用于创建基于相应式数据的派生状态,并具有缓存功能。
  1. import { computed } from 'vue';
  2. const doubled = computed(() => count.value * 2);
  3. console.log(doubled.value); // 自动计算并缓存结果
复制代码

4. 与 Vue 2 的对比

特性Vue 2 (Object.defineProperty)Vue 3 (Proxy)支持的数据类型仅支持对象和数组支持对象、数组、Map、Set 等多种类型深度相应式初始化时递归遍历对象按需追踪,性能更优新增/删除属性相应式需要 Vue.set 或 Vue.delete原生支持性能初始化开销较大,动态追踪效率低初始化开销小,动态追踪效率高
5. 总结

Vue 3 的相应式体系使用 Proxy 和优化的依赖追踪机制(track、trigger),实现了:

  • 更灵活的相应式能力(支持 Map、Set 等)。
  • 更高的性能(按需追踪,避免冗余盘算)。
  • 更简便的 API(无需手动处理新增/删除属性)。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表