关于vue3的reactive和ref的区别
在 Vue 3 中,reactive 和 ref 是响应式系统的核心工具,但它们有一些重要的区别,下面详细解释:
1. ref 是用于 基本类型(也可以用于对象)
import { ref } from 'vue';
const count = ref(0);
console.log(count.value); // 0
count.value++; // 修改响应式值
//模板中使用
<template>
<div>{{ count }}</div>
</template>
ref的特点:ref(0)创建的是一个响应式包装对象:{ value: 0 }- 访问和修改值要通过
.value - 在模板中使用时,Vue 会自动解包
.value,可以直接用{{ count }}
适合用于 字符串、数字、布尔值、null、undefined 等基本类型。
2. reactive 是用于 对象、数组、Map 等引用类型
import { reactive } from 'vue';
const state = reactive({
count: 0,
name: 'Vue3'
});
console.log(state.count); // 0
state.count++; // 响应式更新
//模板中使用
<template>
<div>{{ state.count }}</div>
</template>
reactive的特点:- 返回的是原始对象的 Proxy 代理
- 可以直接读写属性,无需
.value - 只能用于对象(不能传基本类型,如
reactive(1)会警告)
3. 对比总结
| 特性 | ref | reactive |
|---|---|---|
| 类型支持 | 基本类型和引用类型 | 只支持引用类型 |
| 解包方式 | .value(模板中自动解包) | 直接访问属性 |
| 内部结构 | { value: xxx } | 代理原对象 |
| 使用场景 | 单个值、基本类型 | 结构化对象(如 state、form) |
| 响应性兼容 | 在数组、对象中使用需解包 | 自身是响应式 |
4. 混合使用
const state = reactive({
count: ref(0), // ref 嵌套在 reactive 中
});
console.log(state.count.value); // 访问 ref 内部的值
state.count.value++; // 修改 ref 值
但推荐在组合式 API 中:
- 基本值使用
ref - 对象用
reactive - 不要将
ref包在reactive里(嵌套.value可能会让代码变复杂)
5. 实用建议
如果你不确定用哪个,可以参考这个经验法则:
- 你要声明的是 一个独立变量(数字、字符串等) → 用
ref - 你要声明的是 一个结构化状态对象(例如表单、用户信息等) → 用
reactive
