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 常搭配使用,按需选型最灵活
相关推荐
快下雨了L24 分钟前
Lua现学现卖
开发语言·lua
香饽饽~、1 小时前
【第十一篇】SpringBoot缓存技术
java·开发语言·spring boot·后端·缓存·intellij-idea
Devil枫2 小时前
Kotlin扩展函数与属性
开发语言·python·kotlin
菠萝加点糖2 小时前
Kotlin Data包含ByteArray类型
android·开发语言·kotlin
2301_803554524 小时前
c++中类的前置声明
java·开发语言·c++
Cacciatore->5 小时前
Electron 快速上手
javascript·arcgis·electron
vvilkim6 小时前
Electron 进程间通信(IPC)深度优化指南
前端·javascript·electron
不想写bug呀6 小时前
多线程案例——单例模式
java·开发语言·单例模式
某公司摸鱼前端7 小时前
ES13(ES2022)新特性整理
javascript·ecmascript·es13
我不会写代码njdjnssj7 小时前
网络编程 TCP UDP
java·开发语言·jvm