vue3中ref和reactive的差异分析

大家在vue3开发中,会经常用到ref和reactive进行响应式数据对象的定义,那就需要了解他们之间的区别和应用场景,下面做一个简单的分析:

一、基本概念

ref 是 Vue 3 提供的一种用于封装基本数据类型(如字符串、数字、布尔值)或单一引用类型值(如单个对象或数组)的函数。它返回一个带有 .value 属性的响应式对象,通过 .value 可以访问和更新封装的原始值。

javascript 复制代码
import { ref } from 'vue'

const count = ref(0)
const user = ref({ name: 'John' })

console.log(count.value) // 需要通过 .value 访问
console.log(user.value.name)

reactive 用于创建深度响应式的对象,它可以处理包含多个属性(包括嵌套属性)的对象或数组。通过 reactive 包装的对象,其所有属性都会成为响应式的,并且能够自动追踪内部属性的增删改查。

javascript 复制代码
import { reactive } from 'vue'

const state = reactive({
  count: 0,
  user: {
    name: 'John'
  }
})

console.log(state.count) // 直接访问

二、底层实现与响应式机制

ref 的实现与更新机制: ref 在底层通常通过一个简单的对象来封装原始值,并暴露 .value 属性。当 .value 被赋新值时,Vue 会识别到这个变化并触发相关的依赖更新。由于 ref 本身仅封装一个值,其更新仅涉及单个属性,因此更新成本较低,适用于不需要深度响应式的情况。

reactive 的实现与更新机制: reactive 则利用 JavaScript 的 Proxy 对象来创建一个透明的代理,对原对象的所有属性进行拦截。当访问或修改代理对象的属性时,Proxy 会触发相应的 getset 钩子函数,这些钩子负责维护依赖关系和触发更新。由于 reactive 能够追踪对象任意层级属性的变化,因此适用于需要深度响应式的复杂数据结构。

三、性能考虑

对于基本类型,ref 更轻量

对于复杂对象,reactive 更高效(因为不需要 .value 访问嵌套属性)

四、总结对比表

|---------------|-----------------|--------------------|
| 特性 | reactive | ref |
| 创建方式 | reactive(obj) | ref(value) |
| 支持数据类型 | 仅对象类型 | 任意类型 |
| 访问方式 | 直接访问属性 | 通过 .value 访问 |
| 模板中使用 | 直接使用 | 自动解包 |
| 重新赋值 | 不能直接替换整个对象 | 可以通过 .value 重新赋值 |
| 解构行为 | 解构会失去响应性 | 解构后仍需 .value |
| TypeScript 支持 | 自动推断类型 | 需要泛型或类型推断 |
| 典型使用场景 | 复杂响应式对象 | 基本类型或需要灵活重新赋值的变量 |

相关推荐
张元清3 分钟前
React useEventSource Hook:自带断线重连的 Server-Sent Events (2026)
javascript·react.js
光影少年5 分钟前
RN 网络请求:Fetch / Axios 封装、超时、拦截器
前端·react native·react.js
学习星球17 分钟前
Vue 3 实战:拆解 RealWorld 项目
前端·vue.js
铁皮饭盒30 分钟前
网页端, 6.5MB人脸识别模型, 谷歌框架, 又快又准
前端·javascript·后端
xiaohaiAIgeo33 分钟前
【2026年】ASHRAE 110与EN 14175通风柜测试标准对比:进口与国产品牌性能差距
java·前端·数据库·科普知识
自进化Agent智能体1 小时前
Hermes 工具与工具集——Hermes 的内置能力
javascript
用户2930750976691 小时前
TypeScript 必考题:Type 与 Interface 全面对比
前端
hunterandroid1 小时前
[鸿蒙从零到一] HarmonyOS 媒体能力实战:图片、音频与视频处理
前端
打呵欠的猫1 小时前
我让 AI 封装了一个 ImageUpload 组件,它设计的 5 层校验链路比我想的周全
前端·ai编程
AlexMaybeBot1 小时前
躺在沙发上开发 Openclaw 的移动端APP
前端·flutter