【vue面试】ref和reactive

这个问题问得非常到位,而且你已经隐约抓到本质了:

ref 和 reactive 并不是"多余的语法糖",而是 Vue 为了解决「数据如何被追踪、如何更新视图」这个核心问题而设计的两种不同数据模型。

我分 「问题 → 解决方案 → 为什么要分成 ref / reactive」 三层来讲,而不是直接讲 API 用法。

⸻

一、Vue 真正要解决的不是"存数据",而是这 3 件事

在 Vue 里,数据从来不是目的,目的永远是:

  1. 数据变了

  2. Vue 能"感知到变化"

  3. 只更新依赖这份数据的视图 / 计算 / 副作用

也就是说,Vue 关心的是:

👉 "这份数据被谁用过?现在变了,要不要重新算?"

这叫:响应式(Reactivity)

⸻

二、JS 原生变量有一个致命问题

let count = 0

count++

JS 本身有两个 Vue 完全搞不定的点:

• ❌ 普通变量 没有"被读取"的钩子

• ❌ 普通变量 没有"被修改"的拦截点

Vue 无法知道:

复制代码
•	谁用过 count?
•	count++ 之后该通知谁?

👉 所以 Vue 必须"包住"你的数据

⸻

三、Vue 的核心技术:Proxy / getter / setter

Vue 3 本质上做的是:

• 读的时候:记录「谁在用我」

• 写的时候:通知「用过我的人更新」

这就需要:

• 对 对象属性 拦截 → Proxy

• 对 单个值 也能拦截 → ❓(JS 原生没有)

这就是 ref 和 reactive 分裂的根源

⸻

四、reactive:解决「对象整体」的响应式问题

适用场景

👉 "我有一个对象 / 数组,我关心的是它里面的字段变化"

const state = reactive({

user: {

name: 'Tom',

age: 18

}

})

Vue 做了什么?

state.name ← 读 → 记录依赖

state.name = x ← 写 → 触发更新

特点

• ✅ 天然适合「对象 / 数组」

• ✅ 结构和原生 JS 非常像

• ❌ 不能直接用于基本类型

为什么?

reactive(1) // ❌ 没有"属性"可拦截

⸻

五、ref:解决「单个值」也要响应式的问题

这是 Vue 被 JS 限制后不得不做的设计

JS 没办法拦截:

count++

所以 Vue 只能变成:

count.value++

ref 本质是什么?

const count = ref(0)

// 内部等价于

{

value: 0

}

然后:

• get value → 收集依赖

• set value → 触发更新

特点

• ✅ 基本类型(number / string / boolean)

• ✅ 也可以包对象

• ❌ 需要 .value(这是 JS 限制,不是 Vue 喜欢)

⸻

六、那为什么不只留一个?(核心问题)

这是你真正问到的地方。

如果只有 reactive

const count = reactive({ value: 0 })

问题:

• 写法丑

• 和 JS 直觉严重不符

• 模板里也很别扭

⸻

如果只有 ref

const state = ref({

user: { name: 'Tom' }

})

问题:

• 每一层都 .value

• 对象操作非常反人类

• 结构表达能力差

⸻

七、所以 Vue 设计成「两条路」

需求 方案

一个值(状态位、计数、开关) ref

一组有关联的数据 reactive

这不是功能重复,而是:

"对不同数据形态,提供最符合人类直觉的建模方式"

⸻

八、它们解决的"真正问题"一句话总结

ref 和 reactive 解决的不是"怎么存数据",而是:

在 JS 语言限制下,如何让 Vue 精确追踪「谁用过什么数据」,并在数据变化时最小代价地更新视图。

⸻

九、从"使用者视角"的判断标准(非常实用)

你在写代码时,可以用这 3 个判断:

  1. 是不是一个"独立状态"

👉 ref

  1. 是不是一组有结构的数据

👉 reactive

  1. 是否会被解构 / 传来传去

👉 ref(稳定)

⸻

十、一句你现在阶段最该记住的话

Vue 的响应式不是"数据结构",而是"数据与依赖之间的契约"。

ref 和 reactive 只是两种不同的"契约形式"。

如果你愿意,下一步我可以直接从 Vue 源码视角(track / trigger)给你画一条"数据 → 视图更新"的完整链路,或者对比 React useState 从"为什么完全不一样"来讲。

相关推荐
福兮说8 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理8 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
专业程序开发源8 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
专业程序开发源9 小时前
springboot社区养老系统44071-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
小呆呆6669 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
凤城老人9 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)9 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan10 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_10 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒11 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端