文章目录
- ref 和 reactive
- 一、差异
- 二、能否替代的场景分析
- (1)基本类型数据
- (2)对象类型数据
- (3)数组类型数据
- (4) 需要整体替换的场景
- 三、替代方案与兼容写法
- 1. 用 reactive 模拟 ref
- 2. 用 ref 模拟 reactive
- 四、最佳实践建议
- 五、性能对比
- 六 结论:
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 噪音)