官方文档及尤雨溪曾明确提到:优先用 ref,不建议盲目使用 reactive。话不多说,用实例带你理清二者的核心区别与实战场景,从此告别响应式踩坑!
Taimili 艾米莉 ( 一款专业的 GitHub star 管理和github 加星涨星工具taimili.com )
艾米莉 是一款优雅便捷的 GitHub star 管理和github 加星涨星工具,基于 PHP & javascript 构建, 能对github star fork follow watch 刷星管理和提升,最适合github 的深度用户
ref - 响应式「万能工具箱」
ref 堪称 Vue 3 响应式的「全能选手」,无论基础类型、对象还是数组,通通能 hold 住,兼容性拉满:
javascript
运行
// 基础类型轻松拿捏
const name = ref('张三') // ✅ 字符串
const age = ref(18) // ✅ 数字
const isLoading = ref(false) // ✅ 布尔值
// 复杂类型同样胜任
const user = ref({ name: '李四' }) // ✅ 对象
const list = ref([]) // ✅ 数组
// 取值/赋值需通过 .value(脚本内)
name.value = '王五'
age.value = 20
list.value.push('新元素')
reactive - 对象专属「响应式容器」
reactive 是专门为对象 / 数组设计的响应式工具,仅支持复杂引用类型,使用时无需 .value,但有个关键限制:不能直接重新赋值!
javascript
运行
// 正确用法:仅用于对象/数组
const user = reactive({ // ✅ 对象
name: '张三',
age: 18
})
const form = reactive({ // ✅ 表单对象
username: '',
password: ''
})
const list = reactive([]) // ✅ 数组(本质是特殊对象)
// 直接操作属性即可响应
user.name = '李四'
form.username = 'admin'
list.push('苹果')
核心避坑点:重新赋值的「生死线」
这是 ref 和 reactive 最关键的区别,也是新手最容易踩坑的地方!
❌ reactive 的致命误区:直接替换整个对象
javascript
运行
// 初始化数组
let list = reactive(['苹果', '香蕉'])
// 模拟接口请求新数据
setTimeout(() => {
const newData = ['西瓜', '葡萄', '芒果']
// ❌ 错误!直接赋值会丢失响应式连接
list = newData
// 页面无更新!原响应式监听器已断开
}, 1000)
✅ ref 的安全方案:.value 自由赋值
javascript
运行
// 初始化
const list = ref(['苹果', '香蕉'])
// 模拟接口请求
setTimeout(() => {
const newData = ['西瓜', '葡萄', '芒果']
// ✅ 正确!.value 赋值保留响应式
list.value = newData
// 页面实时更新,响应式不中断
}, 1000)
✅ 若坚持用 reactive:嵌套一层对象
javascript
运行
const state = reactive({
list: ['苹果', '香蕉'] // 把要更新的属性包在顶层对象里
})
setTimeout(() => {
const newData = ['西瓜', '葡萄', '芒果']
// 仅更新属性,不替换整个 reactive 对象
state.list = newData // ✅ 响应式正常生效
}, 1000)
实战选择指南:一眼分清该用谁
情况 1:基础数据类型(数字 / 字符串 / 布尔)→ 必用 ref
javascript
运行
// ✅ 正确用法
const count = ref(0)
const username = ref('')
const isVisible = ref(true)
// ❌ 错误用法:reactive 不支持基础类型(直接报错)
// const count = reactive(0)
情况 2:需要整体重新赋值(如接口数据更新)→ 必用 ref
javascript
运行
// 接口请求场景
const data = ref(null)
const fetchData = async () => {
const result = await api.getData()
data.value = result // ✅ 自由赋值,响应式不丢失
}
// 分页切换场景
const currentPageData = ref([])
const changePage = (page) => {
currentPageData.value = getDataByPage(page) // ✅ 安全更新
}
情况 3:固定对象 / 表单,仅修改属性 → 可选用 reactive
javascript
运行
// 表单数据(通常只改字段,不替换整个表单)
const form = reactive({
username: '',
password: '',
remember: false
})
// 用户信息(仅更新部分属性,如头像、年龄)
const userInfo = reactive({
name: '张三',
age: 25,
avatar: ''
})
情况 4:不确定用哪个 → 无脑选 ref
javascript
运行
// 安全无踩坑,万能解决方案
const something = ref(初始值)
黄金法则:记住这 4 点,永不踩坑
- 处理数字、字符串、布尔值 → 用 ref;
- 需要
xxx = 新数据整体赋值 → 用 ref; - 仅操作固定对象的属性(不替换整个对象)→ 可考虑 reactive;
- 犹豫不定时 → 直接用 ref(永远不会错)。
记住:ref 是响应式的「安全牌」,兼容性强、用法灵活;reactive 虽简洁,但有直接赋值的限制,一不小心就丢响应式。遵循尤雨溪的建议,优先用 ref 准没错!# github加星 star 艾米莉