参考答案:
在 Vue 3 中,ref
和 reactive
都是用于创建响应式数据的核心 API,但它们在用途、返回值、适用场景和底层机制上存在明显差异。理解这两者的区别,有助于合理选择响应式策略、避免不必要的副作用,也有助于提升开发效率与代码一致性。
ref
.value
访问。1import { ref } from 'vue'; 2 3const count = ref(0); 4count.value++; // 必须通过 .value 访问
reactive
1import { reactive } from 'vue'; 2 3const state = reactive({ count: 0 }); 4state.count++; // 直接访问属性即可
ref
:对基本类型做响应式包裹;对对象是浅层包裹,内部对象不会自动递归为响应式。
1const obj = ref({ a: 1 }); 2obj.value.a = 2; // a 是响应式的,因为 Vue 内部自动转为 reactive
reactive
:会将对象的所有嵌套属性递归转换为响应式(深层响应式)。
1const obj = reactive({ a: { b: 1 } }); 2obj.a.b = 2; // b 是响应式的
ref
:需要 .value
访问包裹的内容;reactive
:可直接访问属性。不过在模板中(<template>
),Vue 会自动解包 ref
,所以不需要加 .value
。
ref
会失去响应性:
1const count = ref(0); 2const { value } = count; 3// value 是普通值,响应性丢失
reactive
直接解构会丢失响应性,推荐使用 toRefs
保留响应性:
1const state = reactive({ count: 0 }); 2const { count } = toRefs(state); // count 变为 ref
场景 | 使用建议 | 原因或说明 |
---|---|---|
基本类型的响应式值(数值、布尔等) | 使用 ref | 轻量、语义清晰 |
对象、数组、结构化数据 | 使用 reactive | 自动深层响应式,写法简洁 |
对象属性需要解构出来使用 | 配合 toRefs | 避免响应性丢失 |
在组合式 API 中管理局部状态 | 两者都可 | 视具体数据结构选择 |
定义类或工厂中需显式包装状态 | 使用 ref | 更适合封装为单个引用 |
ref
是对值的响应式容器封装,内部通过 Object.defineProperty
定义 .value
,并调用 reactive
对对象自动包裹;reactive
则是直接对目标对象进行 Proxy 包裹,返回一个代理对象,重写 get
/ set
等操作符;effect
, track
, trigger
),但入口形式和封装语义不同。最近更新时间:2025-08-04
题库维护不易,您的支持就是我们最大的动力!