news 2026/4/16 13:46:10

【Vue3】 中 ref 与 reactive:状态与模型的深入理解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Vue3】 中 ref 与 reactive:状态与模型的深入理解

目录

  • Vue3 中 ref 与 reactive:状态与模型的深入理解
    • 一、概念区分:状态 vs 模型
      • 状态(State)
      • 模型(Model / 业务模型)
    • 二、ref vs reactive 使用原则
    • 三、典型使用示例
      • 状态(ref)
      • 模型(reactive)
    • 四、响应式失效场景
      • reactive 失效
      • ref 失效
    • 五、toRef / toRefs 简单说明
    • 六、const vs let
    • 七、企业级标准写法
    • 八、总结

Vue3 中 ref 与 reactive:状态与模型的深入理解

一、概念区分:状态 vs 模型

在 Vue3 里,理解状态(State)模型(Model)的区别,是选用 ref 或 reactive 的核心。

状态(State)

  • 描述“当前的情况”,组件或业务逻辑随时间变化的值
  • 生命周期短,通常只在当前页面或组件内存在
  • 用途:驱动界面渲染,表示当前状态

示例(ToB 项目中常见):

constloading=ref(false)// 是否加载中constcurrentRow=ref<Row|null>(null)// 当前选中行constisModalOpen=ref(false)// 模态框是否打开

特点:

  • 可为空或可替换
  • 整体赋值频繁
  • 对象通常较简单,字段不多

模型(Model / 业务模型)

  • 描述业务对象或数据结构
  • 生命周期相对长,从接口获取到组件销毁
  • 内部字段会频繁修改,但整体对象通常不会被替换

示例(表单对象):

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

特点:

  • 字段多、层级可能复杂
  • 内部字段修改频繁
  • 用于表单绑定、业务数据处理

二、ref vs reactive 使用原则

场景适合类型使用原因优缺点
状态选中项、loading、modal开关、timer关注“变量是谁”,可能整体替换✅ 可空、可替换、生命周期短 ❌ 访问深层字段需要 .value
模型表单对象、业务实体、配置对象关注内部字段修改,不会整体替换✅ 模板 v-model 友好、字段可直接访问 ❌ 整体替换不行、解构易失效

口诀:

关心整个变量是谁 → 状态 → ref
关心内部字段 → 模型 → reactive

三、典型使用示例

状态(ref)

constloading=ref(false)constcurrentRow=ref<Row|null>(null)constisModalOpen=ref(false)constselectRow=(row:Row)=>{currentRow.value=row}constcloseModal=()=>{currentRow.value=nullisModalOpen.value=false}

模型(reactive)

constform=reactive({name:'',age:0,role:'',enable:true})// 修改字段form.name='ssy'form.age=18form.enable=false// 初始化 / 填充表单Object.assign(form,res.data)

四、响应式失效场景

reactive 失效

  • 整体替换:
form={name:'new'}// ❌
  • 解构:
const{name}=form// ❌
  • 深拷贝 / JSON 化:
constcopy=JSON.parse(JSON.stringify(form))// ❌

ref 失效

  • 忘记.value
count++// ❌
  • 解构对象字段:
const{name}=formRef.value// ❌

解决方法:使用toReftoRefs

五、toRef / toRefs 简单说明

  • toRef将 reactive 对象的某个属性单独变成 ref
  • toRefs批量生成 ref
constform=reactive({name:'',age:18})constname=toRef(form,'name')const{name,age}=toRefs(form)

六、const vs let

  • 默认 const,因为 ref / reactive 内部的值是可变的,不需要重新赋值变量名

  • 使用 let的场景:

    • 变量名会被重新赋值(timer, editorInstance, 流程变量)
    • 循环累计 / 分支赋值
lettimer:number|null=nulltimer=setTimeout(...)

七、企业级标准写法

// 状态constloading=ref(false)constlist=ref<Item[]>([])constcurrentRow=ref<Row|null>(null)// 表单 / 模型constform=reactive({name:'',age:0,role:''})

八、总结

  • 状态 → ref:可空、可替换、短生命周期、关心“是谁”
  • 模型 → reactive:字段多、长期存在、关心字段变化
  • toRef / toRefs:解构 reactive 保持响应
  • const 优先,let 仅在变量会被重赋值时使用
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 1:20:52

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

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

作者头像 李华
网站建设 2026/4/15 16:18:56

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

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

作者头像 李华
网站建设 2026/4/15 23:54:33

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

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

作者头像 李华
网站建设 2026/4/12 9:47:56

实习面试题-Kotlin 面试题

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

作者头像 李华
网站建设 2026/3/30 12:28:08

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

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

作者头像 李华
网站建设 2026/4/8 22:44:56

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

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

作者头像 李华