尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

《Vue3 从入门到大神06篇》ref 还是 reactive?一文搞懂响应式数据的选择
📅 发布时间:2026/7/6 1:54:25

在 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 的高级玩法

相关新闻

  • MLOps六大基础原则:模型上线不翻车的实操守则
  • ASPICE实践指南 —— 过程能力模型(Process capability model)的落地解析
  • Spring Boot 4.0 对 AOT(提前编译)和 GraalVM 原生镜像的支持有哪些强制性变化或核心增强?如何针对原生镜像环境进行代码适配?

最新新闻

  • 企业人才战略规划
  • 从零开始成为白帽黑客:Web安全漏洞挖掘实战入门指南
  • YAGEKO雅阁固企业文化理念与未来发展布局
  • 《3分钟速成Codex》全网最简单的安装攻略,从0开始,没GPT账号也能轻松上手
  • 基于51/STM32单片机智能马桶控制系统 物联网无线传输红外感应3321(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • Redis 突然变慢了如何排查并解决?

日新闻

  • AI智能体安全防护框架AgentGuard:从原理到实战部署指南
  • KMX63与PIC18F26K40硬件组合及低功耗设计实践
  • 基于YOLO13改进的门体检测模型:C3k2模块与PoolingFormer技术解析

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号