Vue3 中 ref 与 reactive 使用场景总结(含对比与示例)

🌟 Vue3 中 ref 与 reactive 使用场景总结(含对比与示例)

📌 本文将帮你彻底理解:

什么时候使用 ref?什么时候使用 reactive?两者到底有什么区别?如何结合使用?看完这一篇就够了!


✳️ 一、基本定义

特性 ref() reactive()
作用 包装基本类型 或对象为响应式 包装对象/数组为响应式
返回值 包装后的对象为 { value: 原始值 } 返回的是原始对象的 Proxy
解构使用 需要 .value 访问 可直接访问属性(但解构会失去响应式)
使用频率 高 中高

🧠 二、选择依据与使用场景

✅ 使用 ref() 的场景:

场景 示例
1. 管理基本类型数据 const count = ref(0)
2. 想响应式访问 DOM 或组件实例 const inputRef = ref(null)
3. 异步加载中状态、定时器等 const loading = ref(false)
4. 单个对象响应式,且需保持 .value 明确性 const user = ref({ name: 'Jin' })
5. 组合式函数中需要透明封装响应式值 return { state: ref(...) }

✅ 使用 reactive() 的场景:

场景 示例
1. 响应式对象或数组 const user = reactive({ name: '张三', age: 18 })
2. 多层嵌套的对象 const form = reactive({ user: { name: '' }, tags: [] })
3. 表单、配置项、复杂数据结构 const config = reactive({ theme: 'dark', size: 'small' })
4. 频繁修改属性值,不需要解构使用 user.age++

🧪 三、常见问题与最佳实践

❓ Q1:为什么不能对 reactive 对象解构?

ts 复制代码
const state = reactive({ count: 0 });
const { count } = state; // ❌ 失去响应式

✅ 正确方式:

ts 复制代码
watch(() => state.count, (val) => { ... });

❓ Q2:ref 和 reactive 能混用吗?

可以,组合使用是常见实践:

ts 复制代码
const form = reactive({ name: '', age: 0 });
const loading = ref(false);

❓ Q3:如何在模板中使用 ref?

无需加 .value,模板中会自动解包:

html 复制代码
<template>
  <div>{{ count }}</div>
</template>

<script setup>
const count = ref(0)
</script>

📘 四、实用示例对比

示例 1:基本类型计数器(推荐 ref)

ts 复制代码
const count = ref(0);
const increment = () => count.value++;

示例 2:表单响应式数据(推荐 reactive)

ts 复制代码
const form = reactive({
  username: '',
  password: '',
});

示例 3:ref + 对象(组合式封装)

ts 复制代码
const user = ref({ name: 'Jin', age: 20 });
// user.value.name = '李四';

✅ 总结对比表

使用目的 推荐方式 理由
基本类型 ref 简洁清晰
引用类型(对象/数组) reactive 自动展开,无需 .value
DOM/组件实例引用 ref 用于 ref="xxx"
嵌套对象响应式 reactive 多层属性修改方便
与组件交互、组合式封装 ref 更好控制数据流

📌 建议记忆口诀:

  • 基本类型用 ref,对象数组选 reactive
  • 模板中免 .value,脚本中别忘 .value
  • 组合 API 常搭配使用,按需选型最灵活
相关推荐
CRMEB系统商城6 小时前
前后端技术栈全面换代!CRMEB 多商户(Java)v3.0更新预告
java·开发语言·小程序·php
2601_962885726 小时前
如何用 Python 画 K 线图(蜡烛图)?(mplfinance + 均线 + 成交量)
开发语言·python
事圆则缓6 小时前
Flutter 状态管理框架对比(三):Riverpod 如何连起购物车与异步价格
开发语言·javascript·flutter
蓝宝石的傻话7 小时前
onvif-go(mickeyzzc/onvif-go v2)完整参考手册:从建工程到写出自己的 NVR 接入
开发语言·后端·golang
Elastic 中国社区官方博客7 小时前
使用 Lucene 搜索你的 Bean —— Elasticsearch
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·lucene
Sayai7 小时前
Neo4j 内嵌模式(Embedded)实战:Java 嵌入式 vs 服务端部署的写入性能对比与 GC 调优
java·开发语言·性能优化·neo4j·图数据库
lyz2468597 小时前
vue3页面因参数未声明而报错的常犯错误
前端·javascript·vue.js
Hilaku7 小时前
我重写了整个项目,但没人感谢我!
前端·javascript·程序员
“AI国潮设计-小江”8 小时前
【SDXL实战】用AI生成“财神爷蛋糕×英歌舞人物”潮汕国潮甜品IP,附Prompt与批量生成思路
开发语言·人工智能·python·aigc
繁华的地方不一定留下你的脚印8 小时前
C++线程如何安全停止与唤醒:std::jthread、stop_token与condition_variable
开发语言·c++