news 2026/7/7 20:24:44

【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/7/7 12:21:24

Vim 分屏操作详解

Vim 分屏操作详解&#x1f4da; 基础分屏命令1. 创建分屏" 水平分割当前窗口&#xff08;上下分屏&#xff09; :sp[lit] [文件名] " 简写 :sp :split [文件名]" 垂直分割当前窗口&#xff08;左右分屏&#xff09; :vsp[lit] [文件名] " 简写 :vs …

作者头像 李华
网站建设 2026/7/7 10:26:45

JSP中如何设计大文件上传的加密传输协议?

大文件传输解决方案设计方案 作为福建某软件公司的技术负责人&#xff0c;针对大文件传输需求&#xff0c;我提出以下技术方案&#xff1a; 一、需求分析与技术挑战 核心需求&#xff1a; 支持50G大文件传输文件/文件夹上传下载&#xff08;保留层级结构&#xff09;断点续传…

作者头像 李华
网站建设 2026/7/7 4:14:27

wangEditor粘贴word超链接自动解析域名

【企业级富文本编辑器功能扩展项目纪实——从需求分析到阿里云OSS集成】 2023年X月X日 周X 上海徐汇区 一、需求拆解与核心约束 作为前端工程师&#xff0c;近期接到客户紧急需求&#xff1a;在现有Vue2 wangEditor4的后台系统中新增三大功能&#xff1a; Word粘贴增强&…

作者头像 李华
网站建设 2026/7/7 10:30:39

wangEditor支持CMS系统word图片压缩处理

《苏州大二程序员的暑假“渡劫”日记&#xff1a;Word图片转存样式保留大作战》 日期&#xff1a;2023年7月18日 星期二 苏州 桑拿天&#xff08;空调房里敲代码&#xff0c;命是奶茶给的&#xff09; 第一章&#xff1a;需求暴击——客户爸爸的“变态”要求 “同学&#xff0…

作者头像 李华
网站建设 2026/7/7 16:39:25

光伏MPPT虚拟同步发电机(VSG)并网仿真模型 结构:前级光伏板采用扰动观察法最大功率跟踪给定值

光伏MPPT虚拟同步发电机(VSG)并网仿真模型 结构&#xff1a;前级光伏板采用扰动观察法最大功率跟踪给定值&#xff0c;然后将该功率通过直流母线电容电压进行功率解耦并经过逆变器输送给右侧的负载和电网 控制&#xff1a;光伏Boost采用经典的扰动观察法&#xff0c;逆变器采用…

作者头像 李华
网站建设 2026/7/7 19:28:15

wangEditor处理站群平台word文档转存需求

拯救秃头程序员系列&#xff1a;Word一键粘贴功能开发记 &#x1f680; 作为福建某知名&#xff08;自封的&#xff09;JAVA程序员&#xff0c;我最近接了个CMS官网项目&#xff0c;客户要求增加Word一键粘贴功能&#xff0c;这简直是要把我本就不富裕的发量再薅掉几根… 需求…

作者头像 李华