第三篇:shallowRef VS shallowReactive

213 阅读3分钟

在 Vue 3 中,shallowRefshallowReactive 是两个用于创建浅层响应式数据的方法。它们与 refreactive 类似,但它们只对顶层数据进行响应式处理,而不深入处理嵌套的对象或数组。下面是对这两个函数的详细解释:

shallowRef

shallowRef 用于创建一个浅层响应式的引用类型。它类似于 ref,但只对顶层的引用进行响应式处理。这意味着如果你将一个对象或数组传递给 shallowRef,它将创建一个响应式的引用,但该对象或数组内部的属性不会被代理,因此它们不会响应式地跟踪变化。

用途

  • 浅层响应式引用:当你需要一个对象或数组的浅层响应式引用时。
  • 性能优化:当对象或数组很大或包含许多嵌套层次时,使用 shallowRef 可以避免代理这些对象,从而提高性能。

示例

import { shallowRef } from 'vue';

const state = { count: 0, details: { name: 'Alice' } };
const stateRef = shallowRef(state);

// 修改顶层属性会触发响应
stateRef.value.count = 10; // 修改 count 的值

// 修改嵌套属性不会触发响应
stateRef.value.details.name = 'Bob'; // 修改 details.name 的值

shallowReactive

shashallowReactive 用于创建一个浅层响应式的对象。它类似于 reactive,但只对顶层的属性进行响应式处理。这意味着如果你传递一个对象给 shallowReactive,它将返回一个响应式的对象,但该对象内部的属性不会被代理,因此它们不会响应式地跟踪变化。

用途

  • 浅层响应式对象:当你需要一个对象的浅层响应式版本时。
  • 性能优化:当对象很大或包含许多嵌套层次时,使用 shallowReactive 可以避免代理这些对象,从而提高性能。

示例

import { shallowReactive } from 'vue';

const state = { count: 0, details: { name: 'Alice' } };
const stateReactive = shallowReactive(state);

// 修改顶层属性会触发响应
stateReactive.count = 10; // 修改 count 的值

// 修改嵌套属性不会触发响应
stateReactive.details.name = 'Bob'; // 修改 details.name 的值

比较

  • shallowRef:返回一个浅层响应式的引用,用于访问或修改顶层的引用。
  • shallowReactive:直接返回一个浅层响应式的对象,用于直接通过对象的属性来访问或修改顶层的属性。

何时使用

  • 当你需要一个对象或数组的浅层响应式引用,并且希望使用 .value 属性来访问或修改顶层的引用时,使用 shallowRef
  • 当你需要一个对象的浅层响应式版本,并且希望直接通过对象的属性来访问或修改顶层的属性时,使用 shallowReactive

总结

shallowRefshallowReactive 都是用来创建浅层响应式数据的方法,但它们的使用场景有所不同。shallowRef 适用于创建对象或数组的浅层响应式引用,而 shallowReactive 用于创建对象的浅层响应式版本。根据你的具体需求选择合适的函数来处理响应式数据。在处理大型或嵌套层次深的对象时,使用这些浅层响应式方法可以提高性能。