如何在Vue 3中使用`ref`和`reactive`创建响应式数据?它们之间有何区别?
如何在Vue 3中使用ref和reactive创建响应式数据?它们之间有何区别?
回答:
在 Vue 3 中,可以使用 ref 和 reactive 来创建响应式数据,但它们的使用场景和内部机制有所不同。
-
使用
ref:-
用于定义基本类型(如字符串、数字、布尔值)或对象类型的响应式数据。
-
使用时需要通过
.value访问或修改其值(在模板中自动解包)。 -
示例:
import { ref, reactive } from 'vue' const count = ref(0) console.log(count.value) // 0 count.value++ const name = ref('Alice')
-
-
使用
reactive:-
用于定义对象类型的响应式数据。
-
直接操作属性,无需
.value。 -
示例:
const state = reactive({ name: 'Bob', age: 25 }) console.log(state.name) // Bob state.age++
-
区别解析:
| 特性 | ref |
reactive |
|---|---|---|
| 适用类型 | 基本类型、对象 | 仅对象(包括数组、Map 等) |
| 访问方式 | 需 .value 获取/设置值 |
直接访问属性 |
| 解包(模板中) | 在模板中自动解包,无需 .value |
自动响应 |
| 响应式丢失风险 | 较低(推荐用于函数返回响应式对象) | 若解构或赋值会丢失响应式 |
| 内部实现 | 包装成一个带有 .value 的对象 |
使用 Proxy 深度代理整个对象 |
最佳实践建议:
- 使用
ref定义变量,尤其是组合式函数(composables)中返回响应式状态。 - 使用
reactive定义结构化的对象状态,但避免解构它。 - 当需要将
reactive对象的部分属性暴露时,使用toRefs来保持响应式。
const state = reactive({ name: 'Tom', age: 30 })
const { name, age } = toRefs(state) // 这样解构后仍保持响应式
这样可以确保在使用组合式 API 时,响应式不会丢失。

发表评论 (审核通过后显示评论):