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

深入解析Vue3中ref与reactive的区别及源码实现

深入解析Vue3中ref与reactive的区别及源码实现

前言

Vue3带来了全新的响应式系统,其中refreactive是最常用的两个API。本文将从基础使用、核心区别到源码实现,由浅入深地分析这两个API。

一、基础使用

1. ref

import { ref } from vueconst count = ref(0)
console.log(count.value) // 0
count.value++

2. reactive

import { reactive } from vueconst state = reactive({ count: 0 })
console.log(state.count) // 0
state.count++

二、核心区别

1. 数据类型

  • ref可以包装任意值类型(原始值、对象)
  • reactive只能处理对象类型

2. 访问方式

  • ref需要通过.value访问
  • reactive直接访问属性

3. 解构行为

  • ref解构后仍保持响应性
  • reactive解构后会丢失响应性

4. 性能考量

  • ref更适合独立的基本类型值
  • reactive更适合复杂对象

三、源码实现解析

1. ref实现原理

// packages/reactivity/src/ref.ts
class RefImpl<T> {private _value: Tprivate _rawValue: Tpublic dep?: Dep = undefinedpublic readonly __v_isRef = trueconstructor(value: T) {this._rawValue = valuethis._value = convert(value)}get value() {trackRefValue(this)return this._value}set value(newVal) {newVal = convert(newVal)if (hasChanged(newVal, this._rawValue)) {this._rawValue = newValthis._value = newValtriggerRefValue(this)}}
}

2. reactive实现原理

// packages/reactivity/src/reactive.ts
function reactive(target: object) {if (isReadonly(target)) {return target}return createReactiveObject(target,false,mutableHandlers,mutableCollectionHandlers)
}function createReactiveObject(target: Target,isReadonly: boolean,baseHandlers: ProxyHandler<any>,collectionHandlers: ProxyHandler<any>
) {// 使用Proxy进行代理const proxy = new Proxy(target,targetType === TargetType.COLLECTION ? collectionHandlers : baseHandlers)proxyMap.set(target, proxy)return proxy
}

四、最佳实践

  1. 基本类型优先使用ref
  2. 复杂对象使用reactive
  3. 组合使用时注意解构问题
  4. 大型项目考虑使用toRefs保持响应性

五、总结

refreactive都是Vue3响应式系统的核心,理解它们的区别和实现原理,能帮助我们更好地使用Vue3开发应用。

http://www.xdnf.cn/news/375355.html

相关文章:

  • PPT图表怎么制作?说5款自己使用过的PPT图表制作工具
  • 《Python星球日记》 第55天:迁移学习与预训练模型
  • Linux系统管理与编程16:PXE自动化安装部署centos7.9操作系统
  • 计算机设计大赛山东省赛区软件开发赛道线上答辩复盘
  • 基于STM32的甲醛检测
  • 金丝猴食品:智能中枢AI-COP构建全链路数智化运营体系
  • 如何快速分享服务器上的文件
  • SemanticSplitterNodeParser 和 Sentence-BERT 的区别和联系是什么
  • Spring Security 深度解析:打造坚不可摧的用户认证与授权系统
  • 双同步坐标锁相环DDSRF-PLL原理说明
  • 基于 Q-learning 的城市场景无人机三维路径规划算法研究,可以自定义地图,提供完整MATLAB代码
  • Pytorch应用 小记 第一回:基于ResNet网络的图像定位
  • LSP里氏替换原则
  • tmux + ttyd 原理
  • FHE 之 面向小白的引导(Bootstrapping)
  • ISP(Image Signal Processor)处理流程及不同域划分
  • 初等数论--莫比乌斯函数
  • STM32硬件I2C驱动OLED屏幕
  • [文献阅读] wav2vec: Unsupervised Pre-training for Speech Recognition
  • 优选算法——队列+BFS
  • Spark的三种部署模式及其特点与区别
  • GitHub 趋势日报 (2025年05月09日)
  • HTTP:十三.HTTP日志
  • 如何解决 PowerShell 显示 “此系统上禁用了脚本运行” 的问题
  • DAMA语境关系图汇总及考前须知
  • 【Linux系统编程】进程属性--进程状态
  • Vision Transformer(ViT)
  • 事务连接池
  • 编写第一个MCP Server之Hello world
  • 【动态导通电阻】软硬开关下GaN器件的动态RDSON