ref 和 reactive
一、差异

特性 |
ref |
reactive |
适用类型 |
任意类型(包括基本类型) |
仅对象/数组 |
访问对象 |
需要通过 .value |
直接访问属性 |
整体替换 |
✅支持(直接赋值) |
❌不支持(需要特殊处理) |
解构保持相应性 |
❌需要配合 toRef |
❌需要配合 toRef |
性能开销 |
较低(仅包装一层) |
较高(深度代理) |
二、能否替代的场景分析
(1)基本类型数据
const count = ref(0);
const count = reactive(0);
(2)对象类型数据
const objRef = ref({ a: 1 });
const objReactive = reactive({ a: 1 });
console.log(objRef.value.a);
console.log(objReactive.a);
(3)数组类型数据
const arrRef = ref([1, 2, 3]);
const arrReactive = reactive([1, 2, 3]);
arrRef.value.push(4);
arrReactive.push(4);
(4) 需要整体替换的场景
const state = ref({ a: 1 });
state.value = { a: 2 };
const state = reactive({ a: 1 });
state = { a: 2 };
三、替代方案与兼容写法
1. 用 reactive 模拟 ref
const count = reactive({ value: 0 });
console.log(count.value);
2. 用 ref 模拟 reactive
const obj = ref({ a: 1 });
console.log(obj.value.a);
四、最佳实践建议
- 基本类型 → 必须用 ref
- 对象/数组 → 优先用 reactive(除非需要整体替换)
- 复杂数据结构 → 混合使用:
const state = reactive({
count: ref(0),
user: reactive({
name: 'Alice'
})
});
- 模板中使用 → 优先用 reactive(避免频繁 .value)
五、性能对比
操作 |
ref |
reactive |
创建响应式对象 |
⭐快 |
⭐⭐慢 |
属性访问 |
⭐⭐⭐快 |
⭐⭐快 |
数组修改 |
⭐⭐中 |
⭐⭐⭐快 |
整体替换 |
⭐⭐⭐快 |
❌不支持 |
六 结论:
不能简单用 reactive 完全替代 ref,但可以根据数据类型和使用场景选择:
- 基本类型 → 必须用 ref
- 对象/数组 → 优先用 reactive
- 需要整体替换 → 必须用 ref
- 模板中直接访问 → 优先用 reactive(减少 .value 噪音)