当前位置: 首页 > article >正文

vue3中ref和reactive的差异分析

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

一、基本概念

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

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 包装的对象,其所有属性都会成为响应式的,并且能够自动追踪内部属性的增删改查。

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 访问嵌套属性)

四、总结对比表

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


http://www.kler.cn/a/610973.html

相关文章:

  • 信息系统运行管理员教程1--信息系统运维概述
  • Linux TTY设备汇总
  • 解决 Vitis HLS 中的 ‘tee.exe‘ 错误问题
  • 【更新中】【React】基础版React + Redux实现教程,自定义redux库和react-redux库
  • fircrawl本地部署
  • 【2025】基于python+django的个性化阅读推荐系统设计与实现(源码、万字文档、图文修改、调试答疑)
  • 从0到1,用Tableau讲好数据故事
  • 用python写网络爬虫
  • 可以把后端的api理解为一个目录地址,但并不准确
  • 2024年SEVC SCI1区TOP:多策略灰狼算法MSGWO,深度解析+性能实测
  • 在 CentOS 系统中开机自动执行 Shell 脚本
  • Windows命令提示符(CMD) 的常用命令分类整理
  • SSL/TLS加密
  • jsBridge在vue中使用
  • 前端数据模拟利器 Mock.js 深度解析
  • Flutter使用自签证书打包ipa
  • 【身份证证件OCR识别】批量OCR识别身份证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式
  • 破局AI落地困局 亚信科技“四位一体手术刀“切开产业智能三重枷锁
  • Android Kotlin 实用扩展函数(持续更新)
  • 分布式锁实战:Redis与Redisson的深度解析