ref 和 reactive (下)

5 阅读3分钟

好,那我给你来一套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.countb.count
本质包一层 valueProxy对象
推荐❌ 不推荐✅ 推荐

🧠面试加分点

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,原因是:

  1. ref 更灵活,可以支持基本类型
  2. 在组合式 API 中更统一(所有响应式都用 ref)
  3. 配合 <script setup> 自动解包,使用更方便
  4. 避免 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% 面试了 😄