ref和reactive

Vue3 响应式核心:ref与reactive全方位对比及实战指南

先记住一句话 Vue3 里想让数据变了页面自动更新,就两个工具: ref(全能) reactive(只给对象用)

1. ref 是什么?

你可以把它理解成:

一个带"监听功能"的盒子

  • 不管你放什么:数字、字符串、对象、数组都行
  • 盒子本身不变,变的是里面的东西
  • 在 JS 里要写 .value 才能拿到内容
  • 模板里自动拆盒子,不用写 .value

例子:

javascript 复制代码
js
  
const count = ref(0)
count.value++ // JS 里必须 .value
 
 
html
  
{{ count }}  <!-- 模板自动拆包 -->
 

优点:

  • 可以整个换掉里面的值
  • 基本类型只能用它

2. reactive 是什么?

理解成:

给一个对象"套上监控外套"

  • 只能给对象/数组用
  • 不用 .value ,直接改属性
  • 深层属性也是响应式

例子:

javascript 复制代码
js
  
const user = reactive({
  name: '张三',
  age: 18
})

user.age = 19 // 直接改,不用 .value
 

缺点:

  • 不能整个换掉对象
  • 一换 = 外套丢了 = 不响应了

3. 最关键区别:能不能整体替换?

ref ✅ 可以整体换

javascript 复制代码
js
  
const form = ref({ name: '', age: '' })

form.value = { name: '新', age: 20 }

盒子还在,只是换了内容 → 依旧响应

reactive ❌ 不能整体换

javascript 复制代码
js
  
const form = reactive({ name: '', age: '' })

form = { name: '新', age: 20 } // 完蛋!响应断了

你把整个对象换了,监控外套没跟着换

4. 解构会丢响应性(超级常见坑)

不管是 ref 还是 reactive,直接解构都会变普通变量,不再响应。

错误:

javascript 复制代码
 
js
  
const state = reactive({ count: 0 })
const { count } = state // 变成普通数字!
count++ // 页面不更新
 

正确:

javascript 复制代码
js
  
import { toRefs } from 'vue'

const { count } = toRefs(state)
count.value++ // 正常响应

toRefs 的作用:把 reactive 里的每个属性都变成 ref

5 ref和reactive 所以真正的关系是:

  • ref 是外层包装

  • 真正做响应式的,还是 reactive + Proxy

一句话总结:

ref = 给基本类型套了个对象壳,再用 reactive 代理这个壳。

因为 reactive不能处理基本数据类型,ref包装成对象就可以了

5. 最简单使用口诀

  • 基本类型(数字、字符串、布尔)→ 用 ref
  • 对象、表单、不想写 .value → 用 reactive
  • 需要重置/整体替换 → 用 ref
  • 要解构 → 用 toRefs

6.总结

  • ref = 万能盒子,能整体替换,基本类型必用
  • reactive = 对象外套,不能整体替换
  • 解构必用 toRefs
  1. 基本类型、对象、数组,全都能用 ref 变成响应式

  2. 如果我处理的是对象,又不想写 .value,就可以用 reactive

  3. 但如果需要替换整个对象,必须用 ref

  4. 因为只有 ref 替换之后不会丢失响应性

  5. 模板里用 ref 包的对象,不需要 .value,模板自动解包

相关推荐
变与不变8062 小时前
jQuery怎么使用
前端·javascript
神膘护体小月半2 小时前
flex 布局的 order 属性
前端·css
paopaokaka_luck2 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
仰望.2 小时前
vue 表格组件 vxe-table 树表格懒加载支持拖拽排序的详细用法
前端·javascript·vue.js·vxe-table
前端 贾公子2 小时前
vite-plugin-uni-manifest 升级指南
前端
小码哥_常2 小时前
iPhone 用户传了张 HEIC,我的前端崩了
前端
小码哥_常2 小时前
你发的原图可能暴露你家地址——聊聊图片 EXIF 隐私
前端
java1234_小锋2 小时前
【技术专题】CSS3 网页技术 - CSS3 优先级
前端·css·css3
鸿蒙开发4 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
屏什么录4 小时前
录屏超过两小时就卡顿崩盘?从参数调优到代码实现,一文彻底搞定长时间录屏
前端·音视频开发