Vue3 ref 和 reactive 的区别
文章目录
Vue3 ref和reactive的深度解析
一、ref和reactive是什么
在Vue3中,ref
和reactive
是两个非常重要的响应式API,它们都用于创建响应式数据。简单来说,ref
用于处理基本数据类型,而reactive
用于处理对象(包括数组)。
ref
:返回一个可变的响应式对象,该对象包含一个名为value
的属性,其基本数据类型值将被存储在这个属性中。reactive
:返回一个对象的响应式代理,该对象本身将被转换为响应式。
二、vue3中如何使用ref和reactive
1. 使用ref
import { ref } from 'vue';
const count = ref(0);
console.log(count.value); // 输出 0
count.value++;
console.log(count.value); // 输出 1
2. 使用reactive
import { reactive } from 'vue';
const state = reactive({ count: 0 });
console.log(state.count); // 输出 0
state.count++;
console.log(state.count); // 输出 1
3. 在模板中使用
模板中不需要.value
来访问ref
的值,Vue会自动处理。
<template>
<div>{{ count }}</div>
<div>{{ state.count }}</div>
</template>
<script>
import { ref, reactive } from 'vue';
export default {
setup() {
const count = ref(0);
const state = reactive({ count: 1 });
return { count, state };
}
};
</script>
4. 解构ref
当从setup
函数中返回响应式数据时,如果直接使用解构,那么会失去响应性。可以使用toRefs
来解决这个问题。
import { reactive, toRefs } from 'vue';
export default {
setup() {
const state = reactive({ count: 0 });
return { ...toRefs(state) };
}
};
5. reactive与ref的互转
const count = ref(0);
const reactiveCount = reactive({ count });
console.log(reactiveCount.count); // 输出 ref对象
console.log(reactiveCount.count.value); // 输出 0
const state = reactive({ count: 0 });
const refCount = toRef(state, 'count');
console.log(refCount.value); // 输出 0
三、ref和reactive包含哪些属性或方法API
1. ref的属性
.value
:访问或更改ref的响应式值。
2. reactive的方法
reactive()
:创建响应式对象。isReactive()
:检查对象是否由reactive
创建。isReadonly()
:检查对象是否由readonly
创建。isProxy()
:检查对象是否是由reactive
或readonly
方法创建的代理。
四、扩展与高级技巧
1. 使用ref处理数组和对象
虽然ref
主要用于基本数据类型,但也可以用来处理数组和对象。
const arr = ref([]);
arr.value.push(1); // 响应式更新
const obj = ref({});
obj.value.key = 'value'; // 响应式更新
2. reactive与Vue2的响应式原理对比
Vue2使用Object.defineProperty
来实现响应式,而Vue3使用Proxy
。reactive
是基于Proxy
实现的,可以监听对象属性的添加和删除。
3. 响应式判断API
Vue3提供了一系列API来判断对象是否为响应式或只读。
import { isReactive, isReadonly, isProxy } from 'vue';
console.log(isReactive(reactive({}))); // true
console.log(isReadonly(readonly({}))); // true
console.log(isProxy(reactive({}))); // true
4. 使用toRaw和markRaw
toRaw
:返回由reactive
或readonly
创建的响应式对象的原始对象。markRaw
:标记一个对象,使其永远不会转换为响应式对象。
import { reactive, toRaw, markRaw } from 'vue';
const state = reactive({ count: 0 });
const raw = toRaw(state);
console.log(raw); // 输出原始对象
const nonReactive = markRaw({ count: 0 });
console.log(isReactive(nonReactive)); // false
5. 自定义ref
可以通过继承RefImpl
类来自定义ref。
import { ref, Ref, customRef } from 'vue';
function useCustomRef(initialValue: number): Ref<number> {
return customRef((track, trigger) => {
return {
get() {
track();
return initialValue;
},
set(value) {
initialValue = value;
trigger();
}
};
});
}
const custom = useCustomRef(0);
console.log(custom.value); // 输出 0
custom.value++;
console.log(custom.value); // 输出 1
五、优点与缺点
优点
ref
和reactive
都是Vue3的响应式API,使得状态管理变得简单和高效。ref
使得基本数据类型的响应式处理变得简单。reactive
可以处理对象和数组,且可以监听属性的添加和删除。
缺点
ref
需要通过.value
来访问和修改值,这在某些情况下可能会稍显繁琐。reactive
在处理大型对象时可能会有性能问题,因为Proxy
的性能开销相对较大。
六、对应“八股文”或面试常问问题
1. Vue3中ref和reactive的区别是什么?
答:ref
用于处理基本数据类型,reactive
用于处理对象和数组。ref
需要通过.value
来访问和修改值,而reactive
则直接操作对象本身。
2. 如何在Vue3中使用ref和reactive?
答:可以通过导入ref
和reactive
函数来创建响应式数据。ref
用于创建基本数据类型的响应式数据,reactive
用于创建对象和数组的响应式数据。
3. Vue3中ref有哪些常用的属性和方法?
答:ref
有一个常用的属性.value
,用于访问和修改ref的响应式值。
4. Vue3中reactive有哪些常用的方法和API?
答:reactive
常用的方法有reactive()
、isReactive()
、isReadonly()
和isProxy()
。
5. Vue3中ref和reactive的优缺点是什么?
答:优点包括使得状态管理变得简单和高效,可以处理基本数据类型和对象/数组。缺点包括ref
需要通过.value
来访问和修改值,reactive
在处理大型对象时可能有性能问题。
七、总结与展望
Vue3的ref
和reactive
是两个非常重要的响应式API,它们使得状态管理在Vue3中变得简单和高效。ref
适用于处理基本数据类型,而reactive
适用于处理对象和数组。虽然它们有一些缺点,但总体来说,它们是Vue3中不可或缺的一部分。随着Vue3的不断发展,我们可以期待这些API在未来会有更多的优化和改进。
看到这里的小伙伴,欢迎点赞、评论,收藏!
如有前端相关疑问,博主会在第一时间解答,也同样欢迎添加博主好友,共同进步!!!