铁佛 发表于 2024-11-24 17:42:12

Vue3相应式原理

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

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

import { reactive } from 'vue';

const state = reactive({
count: 0,
info: {
    name: 'Vue',
    version: 3
}
});
在上述代码中:


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

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

[*]依赖网络:当某个相应式属性被访问时,Vue 会记载哪个组件或函数依赖了该属性。
[*]触发更新:当相应式属性的值发生变革时,Vue 关照全部依赖该属性的函数重新执行。
依赖网络是通过 Effect 函数 实现的:
import { effect } from 'vue';

effect(() => {
console.log(state.count);
});
在执行 effect 时,Vue 会自动订阅 state.count,因此当 state.count 的值发生变革时,该 effect 会重新运行。
2. Proxy 的焦点拦截点

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

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

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

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


[*]track:在 get 中调用,用于记载依赖。
[*]trigger:在 set 中调用,用于关照依赖更新。
3. 相应式工具

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



[*]reactive:将对象或数组转换为相应式对象。
[*]ref:用于包装单个值,使其具有相应式能力。
import { ref } from 'vue';

const count = ref(0);

effect(() => {
console.log(count.value); // 监听 count 的变化
});
count.value++; // 触发更新
3.2 computed



[*]computed 用于创建基于相应式数据的派生状态,并具有缓存功能。
import { computed } from 'vue';

const doubled = computed(() => count.value * 2);
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企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Vue3相应式原理