当前位置: 首页 > news >正文

《Vue3 从入门到大神06篇》ref 还是 reactive?一文搞懂响应式数据的选择

在 Vue3 中,我们拥有了两个创建响应式数据的 API:

  • ref

  • reactive

于是,几乎所有初学者都会遇到同一个问题:

什么时候用 ref?什么时候用 reactive?

为什么 ref 要写.value

为什么解构会丢失响应式?

这篇文章,我们就来一次把这些疑问彻底讲清楚


一、一句话结论(先给你答案)

数据类型

推荐 API

基本类型(string / number / boolean)

ref

对象 / 数组

reactive(或ref

表单字段 / 单个状态

ref

复杂状态对象

reactive

📌经验法则

能用 ref 解决的,就用 ref;复杂对象再用 reactive。


二、ref:为基本类型而生

1️⃣ ref 的基本用法

import { ref } from 'vue' const count = ref(0) count.value++ console.log(count.value) // 1

2️⃣ 为什么 ref 需要.value

因为:

JavaScript 的基本类型不是对象,不能被 Proxy 直接代理。

Vue3 的解决方案是:

ref(0) → { value: 0 }

📌ref 本质

  • 用一个对象包裹基本类型

  • 对这个对象的value做响应式处理


三、reactive:为引用类型而生

1️⃣ reactive 的基本用法

import { reactive } from 'vue' const state = reactive({ count: 0, user: { name: 'Tom' } })

2️⃣ 使用方式

state.count++ state.user.name = 'Jerry'

不需要.value

可以直接访问属性


四、ref 和 reactive 的本质区别

对比项

ref

reactive

包装方式

{ value }

Proxy

支持类型

基本 + 引用

仅引用

.value

必须

不需要

替换整个对象

✅ 支持

❌ 丢失响应式

解构

❌ 易丢响应式

✅ 可直接解构


五、.value的底层原理(面试重点)

1️⃣ ref 的简化实现

function ref(value) { const wrapper = { value } return reactive(wrapper) }

📌核心思想

  • ref内部其实也用了reactive

  • 只是多包了一层value


六、解构为什么会丢失响应式?(非常重要)

1️⃣ 错误示例

const state = reactive({ count: 0 }) const { count } = state count++ // ❌ 不再是响应式

2️⃣ 原因图解

state.count → Proxy count → 普通数字(脱离 Proxy)

📌结论

解构得到的是“值本身”,不是“代理引用”。


七、如何正确解构响应式数据?

✅ 方案 1:toRefs

import { reactive, toRefs } from 'vue' const state = reactive({ count: 0 }) const { count } = toRefs(state) count.value++

✅ 方案 2:保持 state 不变

state.count++

八、ref 和 reactive 的常见误区

❌ 误区 1:reactive 可以替换 ref

const count = reactive({ value: 0 }) // ❌ 不推荐

📌原因:语义混乱,不符合 Vue 设计初衷。


❌ 误区 2:ref 不能包对象

const user = ref({ name: 'Tom' })

这是允许的,但注意

user.value.name = 'Jerry'

九、实战选择建议(强烈建议收藏)

✅ 表单场景

const username = ref('') const password = ref('')

✅ 复杂业务对象

const user = reactive({ id: 1, name: '', roles: [] })

✅ 组合式函数返回

function useCounter() { const count = ref(0) const inc = () => count.value++ return { count, inc } }

十、面试高频问答

Q1:ref 为什么要.value

因为基本类型不能被 Proxy 代理,需要包一层对象。

Q2:reactive 解构为什么会失效?

解构得到的是原始值,脱离了 Proxy。

Q3:什么时候用toRefs

当你需要把 reactive 拆成多个 ref 使用时。


十一、总结

  • ref:基本类型 + 单个状态

  • reactive:复杂对象

  • .value是 ref 的设计必然

  • 解构 reactive 会丢失响应式

  • toRefs是解决手段


📢 下期预告

👉第 07 篇:计算属性与侦听器 —— computed 与 watch 的高级玩法

http://www.rkmt.cn/news/1545856.html

相关文章:

  • MLOps六大基础原则:模型上线不翻车的实操守则
  • ASPICE实践指南 —— 过程能力模型(Process capability model)的落地解析
  • Spring Boot 4.0 对 AOT(提前编译)和 GraalVM 原生镜像的支持有哪些强制性变化或核心增强?如何针对原生镜像环境进行代码适配?
  • 2026年 钙钛矿太阳能路灯企业排行榜
  • 2026 江苏南京市(全区域服务)彩钢瓦翻新 / 防水 / 补漏 / 除锈喷漆|金属钢结构厂房屋面修缮 TOP4 权威推荐 + 完整避坑指南 - 本地便民网
  • 华硕笔记本终极控制方案:G-Helper完全替代臃肿奥创中心
  • 2026年推荐五常大米/五常大米溯源高口碑品牌推荐 - 品牌宣传支持者
  • Grok 4:强化学习驱动的推理范式跃迁
  • 2026 江苏苏州全域|彩钢瓦翻新 / 防水补漏 / 钢结构雨中行屋面修缮 - 本地便民网
  • 基于 Raspberry Pi Pico 2 C/C++ SDK 的 SGP30 空气质量监测器
  • 2026年正规的永磁专用变频器/上海永磁变频器/变频器/上海永磁变频器控制器厂家选择推荐 - 行业平台推荐
  • 2026年口碑好的吊钩式抛丸机/悬链式吊钩式抛丸机优质厂家推荐榜 - 品牌宣传支持者
  • 从概念到实战:dB、dBm、dBc在无线通信中的精准应用
  • 3D高斯泼溅编辑终极指南:从零开始掌握SuperSplat完整工作流
  • 2026年专业的上海水泵压力控制器/泵军师水泵控制器/上海控制器推荐厂家精选 - 品牌宣传支持者
  • 从提示词工程到 Harness 设计范式
  • 正确且逆向才能赚最多钱
  • 2026年评价高的四川HDPE检查井管道/四川水泥检查井管道/HDPE钢带波纹管道厂家精选合集 - 品牌宣传支持者
  • 2026年靠谱的铸件吊钩式抛丸机/悬链式吊钩式抛丸机/吊钩式抛丸机横向对比厂家推荐 - 行业平台推荐
  • 2026年优秀的橡胶履带式抛丸机/PLC控制履带式抛丸机厂家综合对比分析 - 品牌宣传支持者
  • Windows 搭建 Hermes 智能代理,实测可行完整步骤
  • 2026 江苏徐州全区域|彩钢瓦翻新 / 防水补漏 / 钢结构屋面修缮公司 TOP4 权威推荐 + 完整避坑指南 - 本地便民网
  • 2026 江苏无锡市(全区域服务)彩钢瓦翻新 / 防水补漏 / 除锈喷漆|金属钢结构厂房屋面修缮 TOP4 权威推荐 + 完整避坑指南 - 本地便民网
  • 大朗这家电商企业靠豆包 GEO优化,AI搜索推荐量单月翻3倍 - 东莞选校指南
  • 2026年诚信的重庆AI GEO/重庆豆包GEO服务好的公司 - 行业平台推荐
  • 成都二手代步车哪家靠谱?久雅品质名车专业选购全方案,专业服务提升二手车买卖满意度 - 品牌推荐师
  • 2026年评价高的武汉室内设计带施工/武汉私宅全案室内设计托管/武汉旧房改造设计优质公司推荐 - 品牌宣传支持者
  • 2026年正规的SMT贴片焊接/苏州SMT加工/SMT代工/苏州高精度SMT精选推荐公司 - 品牌宣传支持者
  • 创始人IP标准体系白皮书-第14卷·组织篇:创始人IP与制度化组织的共生悖论
  • 非科班转码 Rust 学习路径:从零基础到写出第一个可用工具的 180 天