📚前端面试题速记
Q3

在 Vue 3 中,ref 和 reactive 有何区别?

速记答案(30 秒)

ref:包一份"值",典型用于基本类型;访问要 .value,可以整体重新赋值。reactive:包"对象/数组",通过 Proxy 深度代理内部属性;不能直接给整个变量重新赋值。

📖 详细讲解

标准面试回答(推荐记住)

ref 适合包装基本类型,访问时需要 .value,可以整体替换;reactive 用于对象和数组,通过 Proxy 深度代理,不能直接替换整个对象。模板中两者都会自动解包。解构 reactive 对象会丢失响应性,需要用 toRef 或 toRefs。

ref vs reactive 核心区别

特性 ref reactive
适用类型 任意类型 对象/数组
访问方式 需要 .value 直接访问
整体替换 ✅ 支持 ❌ 丢失响应性
模板解包 自动 自动
解构 保持响应性 需要 toRefs

使用建议

推荐使用 ref:
• 基本类型(string、number、boolean)
• 需要整体替换的对象
• 组件 ref 引用

推荐使用 reactive:
• 复杂对象状态
• 表单数据
• 不需要整体替换的场景

常见陷阱

// ❌ 解构丢失响应性
const { count } = reactive({ count: 0 })

// ✅ 使用 toRefs 保持响应性
const { count } = toRefs(state)

// ✅ 或使用 toRef 单个属性
const count = toRef(state, 'count')

面试要点

  • 清楚两者的使用场景区别
  • 理解解构丢失响应性的原因
  • 知道 toRef/toRefs 的用途

💻 代码示例

ref vs reactive 对比
import { ref, reactive, toRefs } from 'vue'

// ref - 适合基本类型
const count = ref(0)
count.value++ // 需要 .value

// reactive - 适合对象
const state = reactive({ count: 0, name: 'Vue' })
state.count++ // 直接访问

// ❌ 错误:整体替换会丢失响应性
// state = { count: 1, name: 'React' }

// ✅ 正确:解构需要 toRefs
const { count: countRef, name } = toRefs(state)