在 Vue 3 中,ref 和 reactive 都是用于创建响应式数据的函数,但是它们有一些区别:
- ref只能用于包装基本类型的数据,如数字、字符串等,而reactive可以用于包装任意类型的数据,包括对象、数组等。
- ref返回的是一个包装后的对象,而reactive返回的是一个响应式的Proxy对象。
- ref可以直接通过.value属性获取包装的值,而reactive需要通过访问属性或者下标来获取值。
- 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 中提供了不同级别的响应式,方便我们根据需求创建和操作响应式数据。