news 2026/6/10 15:48:28

深入理解ref、reactive【Vue3工程级指南】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入理解ref、reactive【Vue3工程级指南】

这篇文章的目标只有一个:让你在任何场景下,都能毫不犹豫地判断:这个地方该用ref,还是reactive

目录

  • 响应式的本质不是变量
  • ref 是什么?什么时候该用 ref?
    • ref 的本质
    • 什么时候必须用 ref(重点)
      • 场景 1:基本类型
      • 场景 2:对象 / 数组会被整体替换
      • 场景 3:对象是“状态”,而不是“模型”
    • ref 的优缺点
  • reactive 是什么?什么时候该用 reactive?
    • reactive 的本质
    • 什么时候 reactive 是最优解
      • 场景 1:表单对象
      • 场景 2:长期存在的业务模型
    • reactive 的优缺点
  • 对象到底用 ref 还是 reactive?
  • 响应式是怎么“失去”的
    • reactive 失效的三大原因
    • ref 失效的常见原因
  • toRef / toRefs:解决解构问题
    • toRef 是什么
    • toRefs 批量使用
  • 总结

响应式的本质不是变量

在 Vue3 里,响应式的本质不是变量,而是“引用关系”

  • ref用一个对象包住一个值,通过 .value 访问
  • reactive用 Proxy 代理一个对象

⚠️:Vue 追踪的不是变量名,而是 ref.value 或 Proxy 内部的属性访问

ref 是什么?什么时候该用 ref?

ref 的本质

constcount=ref(0)
  • count 是一个对象
  • 真正的值在 count.value
  • Vue 通过 getter / setter 追踪 .value

在模板里:

{{count}}// 自动解包

在js/ts中:

count.value++

什么时候必须用 ref(重点)

场景 1:基本类型

constloading=ref(false)constpage=ref(1)constkeyword=ref('')

场景 2:对象 / 数组会被整体替换

constlist=ref<Item[]>([])list.value=res.data

如果用 reactive:

constlist=reactive([])list=res.data// ❌ 直接失效

只要你会写 = 重新赋值,就用 ref!!!

场景 3:对象是“状态”,而不是“模型”

什么是状态,什么是模型???

constcurrentRow=ref<Row|null>(null)
  • 有 / 没有
  • 选中 / 取消
  • 打开 / 关闭

这是状态,不是业务结构

ref 的优缺点

优点:

  • 可以整体替换
  • 可以为 null / undefined
  • 解构安全
  • 状态语义清晰

缺点:

  • JS 中需要 .value
  • 对象层级深时略显啰嗦

reactive 是什么?什么时候该用 reactive?

reactive 的本质

constform=reactive({name:'',age:18})
  • 返回的是一个 Proxy
  • 每个属性访问都会被 Vue 追踪
  • 没有 .value

什么时候 reactive 是最优解

场景 1:表单对象

constform=reactive({name:'',age:0,role:''})

原因:

  • 字段多
  • 高频修改单字段
  • v-model 非常频繁
  • 不需要整体替换

场景 2:长期存在的业务模型

conststate=reactive({loading:false,page:1,pageSize:10})

这些数据:

  • 生命周期一致
  • 逻辑上属于一组
  • 不会被整体重置

reactive 的优缺点

优点:

  • 写法自然
  • 表单 / v-model 体验极佳
  • 代码可读性高

缺点:

  • ❌ 不能整体替换
  • ❌ 不能为 null
  • ❌ 解构会丢响应式

对象到底用 ref 还是 reactive?

四个问题法(直接用)

refreactive
会不会被整体替换会 -> ref不会 -> reactive
关心"对象是谁"or"字段怎么变"?是谁 -> ref字段 -> reactive
会不会大量 v-model会 -> reactive
是不是长期业务模型是 -> reactive

响应式是怎么“失去”的

reactive 失效的三大原因

form=newForm// ❌ 整体替换const{name}=form// ❌ 解构JSON.parse(JSON.stringify(form))// ❌ 深拷贝

正确做法:

Object.assign(form,newForm)

ref 失效的常见原因

constc=count.value// ❌ 断开引用

因为这里只是把count这个响应式的值给了c而已

toRef / toRefs:解决解构问题

toRef 是什么

constname=toRef(form,'name')
  • 把 reactive 的某个字段变成 ref
  • 双向同步

toRefs 批量使用

const{name,age}=toRefs(form)

它们的原理都是 把reactive内的变量都解构成响应式的ref包裹的变量

总结

  • reactive 负责“结构”
  • ref 负责“状态”
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:29:23

Asio应用(高级):构建高性能、安全、跨平台的网络系统

从异步模型到高级应用&#xff0c;这一步跨越的不只是技术栈的扩展&#xff0c;更是从“能用”到“卓越”的工程思维转变。本文将带你深入Asio的高级应用领域&#xff0c;掌握构建企业级网络系统的核心技能。 1. 复杂协议实现&#xff1a;超越TCP/UDP HTTP服务器实现&#xff1…

作者头像 李华
网站建设 2026/6/10 13:29:16

苹果叶片病害检测与分类:Yolo11-C3k2-iRMB-Cascaded模型创新应用详解

本数据集名为"apple diseases detection - v3 apppppppppl"&#xff0c;是一个专门用于苹果叶片病害检测的计算机视觉数据集&#xff0c;采用YOLOv8格式标注。该数据集由qunshankj平台用户提供&#xff0c;采用MIT许可证授权&#xff0c;于2023年9月2日导出。数据集共…

作者头像 李华
网站建设 2026/6/9 16:42:47

实习面试题-ZooKeeper 原理面试题

1.ZooKeeper 使用推送模式还是拉取模式来通知客户端? 回答重点 ZooKeeper 使用的是推送模式(push model)来通知客户端。 扩展知识 1)什么是推送模式和拉取模式? 推送模式(Push Model)意味着服务器主动将数据或变更推送给客户端;而拉取模式(Pull Model)则是客户端…

作者头像 李华
网站建设 2026/6/9 16:25:35

实习面试题-Kotlin 面试题

1.Kotlin 有哪些特点?它和 Java 有什么区别? 回答重点 Kotlin 是 JetBrains 公司在 2011 年推出的现代编程语言,2017 年被 Google 宣布为 Android 开发的官方首选语言。它最大的特点就是简洁、安全、实用,被称为"更好的 Java"。 Kotlin 的核心特点可以总结为几…

作者头像 李华
网站建设 2026/6/9 21:04:46

JSP中如何集成SM4加密实现大文件上传存储安全?

大文件传输系统解决方案 项目背景与需求分析 作为北京某软件公司项目负责人&#xff0c;我们面临一个关键的大文件传输功能需求。经过深入分析&#xff0c;现有需求可归纳为以下几个核心要点&#xff1a; 大文件传输能力&#xff1a;需支持50G以上文件传输&#xff0c;包含文…

作者头像 李华
网站建设 2026/6/10 7:07:10

网页页面如何设计JSP大文件上传的错误处理机制?

《一个Java老码农的20G文件夹上传历险记》 大家好&#xff0c;我是老王&#xff0c;一个在西安写了15年Java的老程序员。最近接了个外包项目&#xff0c;需求简单概括就是&#xff1a;“用IE9上传20G文件夹&#xff0c;预算100块还要724小时支持”——这感觉就像是让我用自行车…

作者头像 李华