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

相关推荐
爱喝白开水a2 分钟前
前端AI自动化测试:brower-use调研让大模型帮你做网页交互与测试
前端·人工智能·大模型·prompt·交互·agent·rag
Never_Satisfied2 分钟前
在JavaScript / HTML中,关于querySelectorAll方法
开发语言·javascript·html
董世昌412 分钟前
深度解析ES6 Set与Map:相同点、核心差异及实战选型
前端·javascript·es6
B站_计算机毕业设计之家16 分钟前
豆瓣电影数据采集分析推荐系统 | Python Vue Flask框架 LSTM Echarts多技术融合开发 毕业设计源码 计算机
vue.js·python·机器学习·flask·echarts·lstm·推荐算法
WeiXiao_Hyy1 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
吃杠碰小鸡1 小时前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone1 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09011 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农2 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king2 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落