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

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

📌 本文将帮你彻底理解:

什么时候使用 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:refreactive 能混用吗?

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

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 常搭配使用,按需选型最灵活
相关推荐
逆向新手1 分钟前
js逆向-某省特种设备aes加密研究
javascript·爬虫·python·逆向·js
秦苒&6 分钟前
【C语言】详解数据类型和变量(一):数据类型介绍、 signed和unsigned、数据类型的取值范围、变量、强制类型转换
c语言·开发语言·c++·c#
我爱学习_zwj6 分钟前
动态HTTP服务器实战:解析请求与Mock数据
开发语言·前端·javascript
flashlight_hi10 分钟前
LeetCode 分类刷题:110. 平衡二叉树
javascript·算法·leetcode
Beginner x_u11 分钟前
Vue 事件机制全面解析:原生事件、自定义事件与 DOM 冒泡完全讲透
前端·javascript·vue.js·dom
梅孔立19 分钟前
【实用教程】python 批量解析 EML 邮件文件 存成txt ,可以利用 AI 辅助快速生成年终总结
开发语言·python
c#上位机30 分钟前
C#异步编程之async、await
开发语言·c#
郑州光合科技余经理42 分钟前
实战分享:如何构建东南亚高并发跑腿配送系统
java·开发语言·javascript·spring cloud·uni-app·c#·php
爱装代码的小瓶子43 分钟前
【c++进阶】C++11新特性:一切皆可{}初始化
开发语言·c++·visual studio
June bug1 小时前
【Vue】EACCES: permission denied 错误
前端·javascript·vue.js