github加星 star 艾米莉 Vue 3 避坑指南:ref 与 reactive 到底该怎么选?尤雨溪推荐「一把梭」方案

76 阅读3分钟

官方文档及尤雨溪曾明确提到:优先用 ref,不建议盲目使用 reactive。话不多说,用实例带你理清二者的核心区别与实战场景,从此告别响应式踩坑!

Taimili 艾米莉 ( 一款专业的 GitHub star 管理和github 加星涨星工具taimili.com )

艾米莉 是一款优雅便捷的 GitHub star 管理和github 加星涨星工具,基于 PHP & javascript 构建, 能对github star fork follow watch 刷星管理和提升,最适合github 的深度用户

WX20251021-210346@2x.png

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 点,永不踩坑

  1. 处理数字、字符串、布尔值 → 用 ref;
  2. 需要 xxx = 新数据 整体赋值 → 用 ref;
  3. 仅操作固定对象的属性(不替换整个对象)→ 可考虑 reactive;
  4. 犹豫不定时 → 直接用 ref(永远不会错)。

记住:ref 是响应式的「安全牌」,兼容性强、用法灵活;reactive 虽简洁,但有直接赋值的限制,一不小心就丢响应式。遵循尤雨溪的建议,优先用 ref 准没错!# github加星 star 艾米莉