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 支持 | 自动推断类型 | 需要泛型或类型推断 |
| 典型使用场景 | 复杂响应式对象 | 基本类型或需要灵活重新赋值的变量 |

相关推荐
烬头882118 分钟前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos
Amumu1213819 分钟前
Vuex介绍
前端·javascript·vue.js
We་ct20 分钟前
LeetCode 54. 螺旋矩阵:两种解法吃透顺时针遍历逻辑
前端·算法·leetcode·矩阵·typescript
2601_9498095931 分钟前
flutter_for_openharmony家庭相册app实战+相册详情实现
javascript·flutter·ajax
qq_1777673736 分钟前
React Native鸿蒙跨平台通过Animated.Value.interpolate实现滚动距离到动画属性的映射
javascript·react native·react.js·harmonyos
2601_949833391 小时前
flutter_for_openharmony口腔护理app实战+饮食记录实现
android·javascript·flutter
2601_949480061 小时前
【无标题】
开发语言·前端·javascript
css趣多多1 小时前
Vue过滤器
前端·javascript·vue.js
理人综艺好会1 小时前
Web学习之用户认证
前端·学习
●VON1 小时前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von