vue3中的ref()和reactive()

160 阅读3分钟

在 Vue 3 中,ref 和 reactive 都是用于创建响应式数据的函数,但是它们有一些区别:

  1. ref只能用于包装基本类型的数据,如数字、字符串等,而reactive可以用于包装任意类型的数据,包括对象、数组等。
  2. ref返回的是一个包装后的对象,而reactive返回的是一个响应式的Proxy对象。
  3. ref可以直接通过.value属性获取包装的值,而reactive需要通过访问属性或者下标来获取值。
  4. ref的更新是通过赋值来实现的,而reactive的更新是通过修改属性或者下标来实现的。

总的来说,ref适用于包装基本类型的数据,而reactive适用于包装任意类型的数据,并且提供了更灵活的访问和更新方式

ref

ref 是一个函数,它接收一个参数作为初始值,并返回一个包装过的响应式对象,此对象只有一个指向其内部值的属性 .value

示例:

import { ref } from 'vue';

const count = ref(0);
console.log(count.value); // 输出:0

count.value++; // 修改 count 的值
console.log(count.value); // 输出:1

ref 用于创建包装过的响应式数据,其中 count 是一个包含 .value 属性的对象。通过访问 .value 属性来读取和修改 count 的值。

详细信息

ref 对象是可更改的,也就是说你可以为 .value 赋予新的值。它也是响应式的,即所有对 .value 的操作都将被追踪,并且写操作会触发与之相关的副作用。

如果将一个对象赋值给 ref,那么这个对象将通过 reactive() 转为具有深层次响应式的对象。这也意味着如果对象中包含了嵌套的 ref,它们将被深层地解包。

若要避免这种深层次的转换,请使用 shallowRef() 来替代。

reactive

reactive 是一个函数,它接收一个普通的 JavaScript 对象,并将其转换为响应式对象,返回一个对象的响应式代理。

示例:

import { reactive } from 'vue';

const user = reactive({
  name: 'Alice',
  age: 25
});

console.log(user.name); // 输出:Alice

user.age++;
console.log(user.age); // 输出:26

reactive 用于创建响应式对象,它将传入的普通 JavaScript 对象转换为响应式对象,使对象的属性成为可观察的,当属性的值发生变化时,会自动进行更新。

详细信息

响应式转换是“深层”的:它会影响到所有嵌套的属性。一个响应式对象也将深层地解包任何 ref 属性,同时保持响应性。

值得注意的是,当访问到某个响应式数组或 Map 这样的原生集合类型中的 ref 元素时,不会执行 ref 的解包。

若要避免深层响应式转换,只想保留对这个对象顶层次访问的响应性,请使用 shallowReactive() 作替代。

返回的对象以及其中嵌套的对象都会通过 ES Proxy 包裹,因此不等于源对象,建议只使用响应式代理,避免使用原始对象。

总结:

  • ref 用于创建单个值的响应式数据,可以通过 .value 访问和修改值。
  • reactive 用于创建包含多个属性的响应式对象,可以直接访问和修改对象的属性。

这些函数在 Vue 3 中提供了不同级别的响应式,方便我们根据需求创建和操作响应式数据。