好,那我给你来一套Vue3 ref / reactive 高频“刁钻面试题” (很多人会翻车🔥),每题都带标准答案 + 为什么,你面试直接能打。
一、基础陷阱题(必问)
❓题1:reactive 为什么不能直接解构?
const state = reactive({ count: 0 });
const { count } = state;
count++; // 会触发更新吗?
✅答案:
👉 不会触发响应式更新
🧠原因(面试关键点)
- reactive 是基于 Proxy
- 解构后,
count变成普通变量 - 丢失了 Proxy 的依赖追踪
👉 本质:
const count = state.count; // 值拷贝,不再响应式
✅正确做法
import { toRefs } from 'vue';
const { count } = toRefs(state);
二、ref 相关坑(高频🔥)
❓题2:ref 包对象 vs reactive,有什么区别?
const a = ref({ count: 0 });
const b = reactive({ count: 0 });
✅答案(核心)
👉 都能响应式,但使用方式不同:
| ref(obj) | reactive(obj) | |
|---|---|---|
| 访问 | a.value.count | b.count |
| 本质 | 包一层 value | Proxy对象 |
| 推荐 | ❌ 不推荐 | ✅ 推荐 |
🧠面试加分点
ref 包对象其实内部也会调用 reactive,但多了一层
.value,使用上不如 reactive 自然。
三、进阶题(区分高手🔥)
❓题3:ref 和 reactive 能混用吗?
const state = reactive({
count: ref(0)
});
state.count++;
✅答案:
👉 可以,而且 Vue 会自动“解包”
🧠解释
- reactive 会自动 unwrap ref
- 所以:
state.count === 0 // ✅
👉 实际上:
state.count++ // 等价于 ref.value++
🚨但注意
state.count = 10;
👉 会直接覆盖 ref!!!
四、经典坑(很多人挂🔥)
❓题4:下面代码会更新视图吗?
const list = reactive([1, 2, 3]);
list = [4, 5, 6];
❌答案:
👉 不会!直接报错 or 失去响应式
🧠原因
- reactive 绑定的是原对象
- 重新赋值 → 指向新对象 → 响应式丢失
✅正确做法
list.splice(0, list.length, 4, 5, 6);
或:
const list = ref([1,2,3]);
list.value = [4,5,6]; // ✅ 推荐
五、终极题(面试官最爱🔥)
❓题5:为什么 Vue3 更推荐 ref?
✅标准答案(直接背)
虽然 reactive 在处理对象时更自然,但 Vue3 更推荐 ref,原因是:
- ref 更灵活,可以支持基本类型
- 在组合式 API 中更统一(所有响应式都用 ref)
- 配合
<script setup>自动解包,使用更方便- 避免 reactive 解构丢失响应式的问题
六、加分题(理解深度🔥)
❓题6:toRefs 和 toRef 区别?
✅答案
toRefs
👉 把整个对象转成 ref
const state = reactive({ a: 1, b: 2 });
const { a, b } = toRefs(state);
toRef
👉 只转一个属性
const a = toRef(state, 'a');
🧠一句话总结
toRefs 是批量转换,toRef 是单个引用绑定
七、面试总结模板(建议背🔥)
你可以这样收尾:
Vue3 中 ref 和 reactive 的主要区别在于:
- ref 通过
.value访问,适合基本类型- reactive 基于 Proxy,适合对象
实际开发中:
- 简单值用 ref
- 复杂对象用 reactive
同时要注意:
- reactive 解构会丢失响应式(需要 toRefs)
- ref 在 reactive 中会自动解包
Vue3 更推荐使用 ref,因为它更统一、灵活,配合 script setup 使用体验更好。
八、如果你想再往上走一档🔥
我可以继续帮你:
👉 手写一个 mini Vue3 响应式系统(Proxy + effect) (大厂高频)
👉 或者出一套 Vue3 原理面试题(源码级)
你现在这套已经能应付 80% 面试了 😄