【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 从"为什么完全不一样"来讲。

相关推荐
LYFlied2 小时前
【每日算法】LeetCode 104. 二叉树的最大深度
前端·算法·leetcode·面试·职场和发展
宁雨桥2 小时前
前端并发控制的多种实现方案与最佳实践
前端
KLW752 小时前
vue2 与vue3 中v-model的区别
前端·javascript·vue.js
李广山Samuel2 小时前
Node-OPCUA 入门(1)-创建一个简单的OPC UA服务器
javascript
zhongjiahao2 小时前
一文带你了解前端全局状态管理
前端
柳安2 小时前
对keep-alive的理解,它是如何实现的,具体缓存的是什么?
前端
keyV2 小时前
告别满屏 v-if:用一个自定义指令搞定 Vue 前端权限控制
前端·vue.js·promise
X_Eartha_8152 小时前
前端学习—HTML基础语法(1)
前端·学习·html
如果你好2 小时前
一文搞懂事件冒泡与阻止方法:event.stopPropagation() 实战指南
前端·javascript