在 Vue 3 中,ref 和 reactive 是两种常用的响应式数据创建方式,它们各有适用场景。以下是它们的对比以及如何选择:
🌟 ref 的特点
✅ 优点:
- 适合基本类型:如字符串、数字、布尔值等。
- 可以解构而不失去响应性:使用
.value访问值,即使被解构后仍保持响应性。 - 支持异步更新:
.value可以在异步操作中安全赋值。 - 可作为响应式的“盒子”:适用于需要显式访问
.value的场景。
❗️缺点:
- 需要频繁写
.value(在模板中会自动解包,但在 JS 中需手动写.value)。
✅ 示例:
const count = ref(0);
count.value++;
🌟 reactive 的特点
✅ 优点:
- 适合对象或数组:深层响应式,处理复杂结构更自然。
- 语法简洁:无需
.value,像普通对象一样访问属性。
❗️缺点:
- 不能解构:如果直接解构会丢失响应性(需要用
toRefs或toRef解决)。 - 不适合基本类型(会被忽略)。
✅ 示例:
const state = reactive({
count: 0,
user: { name: 'Alice' }
});
state.count++;
🔁 对比总结表:
| 特性 | ref | reactive |
|---|---|---|
| 响应性保持 | 解构后不丢失(通过 .value) | 解构后会丢失 |
| 基本类型支持 | ✅ | ❌(必须是对象) |
| 模板中是否自动解包 | ✅ | ✅ |
| 是否需要 .value | ✅ | ❌ |
| 异步更新支持 | ✅ | ✅ |
| 推荐用于 | 基本类型、简单状态管理 | 复杂对象、组件状态集合 |
🧠 如何选择?
✅ 使用 ref 的情况:
- 管理的是一个基本类型(如 number、string、boolean)。
- 需要将响应式变量从一个函数返回或传递出去。
- 在组合式 API 中,希望封装多个独立的状态片段。
- 需要解构但仍保持响应性(比如从某个对象中提取出一个 ref)。
✅ 使用 reactive 的情况:
- 管理一个对象或嵌套对象。
- 数据结构较复杂,且希望保持代码简洁。
- 将多个相关状态组织在一起作为一个整体。
💡 最佳实践建议:
- 默认用
ref:尤其是在 Composition API 中,因为其灵活性和兼容性更好。 - 用
reactive包装对象:当你有一个对象结构,并且不需要解构它时。 - 避免混合使用:不要把
ref放入reactive中(Vue 会自动解包),但反之则不行。

