在Vue3中,ref
、reactive
、toRef
和toRefs
是用于创建和管理响应式数据的核心API,它们的区别如下:
.value
访问或修改值。.value
。reactive
。const count = ref(0);
count.value = 1; // 修改值
const obj = ref({ foo: 1 });
obj.value.foo = 2; // 自动调用reactive处理对象
.value
。const state = reactive({ count: 0, nested: { foo: 1 } });
state.count++; // 直接修改
state.nested.foo = 2; // 深层响应
ref
,保持与源属性的引用关联。ref
或源属性会互相触发更新。const state = reactive({ foo: 1 });
const fooRef = toRef(state, 'foo');
fooRef.value = 2; // 修改会同步到state.foo
state.foo = 3; // 修改也会同步到fooRef.value
ref
。setup()
返回,确保模板中直接使用属性名。const state = reactive({ foo: 1, bar: 2 });
const stateRefs = toRefs(state); // { foo: Ref<1>, bar: Ref<2> }
// 在setup()中返回,模板可直接使用foo和bar
return { ...stateRefs };
方法 | 适用类型 | 返回值 | 访问方式 | 主要场景 |
---|---|---|---|---|
ref |
任意类型 | Ref 对象 |
.value |
基本类型、需要引用的对象 |
reactive |
对象/数组 | 代理对象 | 直接访问属性 | 复杂状态对象 |
toRef |
响应式对象的属性 | Ref 对象 |
.value |
需要持久化追踪单个属性 |
toRefs |
响应式对象 | 普通对象(包含多个Ref ) |
直接访问(自动解包) | 解构/展开对象时保留响应性 |
ref
(如字符串、数字)。reactive
,结合toRefs
解构返回。toRef
和toRefs
保持响应性,避免解构丢失响应。// 组合函数示例
function useFeature() {
const state = reactive({ x: 0, y: 0 });
return toRefs(state); // 返回{ x: Ref<0>, y: Ref<0> }
}
// 使用
const { x, y } = useFeature(); // 解构后仍为响应式