当前位置: 首页 > 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开发应用。

相关文章:

  • 居然智家亮相全零售AI火花大会 AI大模型赋能家居新零售的进阶之路
  • 银河麒麟桌面V10-SP1-2303操作系统V10加固手册
  • 【Linux】基础 IO(一)
  • 深入浅出之STL源码分析2_类模版
  • 实现三个采集板数据传送到一个显示屏的方案
  • 大模型(LLMs)强化学习——RLHF及其变种
  • Fabric系列 - SoftHSM 软件模拟HSM
  • Yocto项目实战经验总结:从入门到高级的全面概览
  • 从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果
  • 数学相关使用笔记
  • Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南
  • KNOWLEDGE-BASED SYSTEMS(KBS期刊)投稿经验分享
  • JavaScript基础-局部作用域
  • 深度学习篇---MediaPipe 及其人体姿态估计模型详解
  • 加速pip下载:永久解决网络慢问题
  • 动态规划之完全背包问题
  • Day21 奇异值分解(SVD)全面解析
  • C++:this指针
  • 编译后的js文件如何跟进调试
  • 研发效率破局之道阅读总结(5)管理文化
  • 国家统计局:4月份居民消费价格同比下降0.1%
  • 拿出压箱底作品,北京交响乐团让上海观众享受音乐盛宴
  • 西安机场回应航站楼“水帘洞”事件:屋面排水系统被冰雹堵塞
  • 央行谈MLF:逐步退出政策利率属性回归流动性投放工具
  • 红场阅兵即将开始!中国人民解放军仪仗队亮相
  • 溢价26.3%!保利置业42.4亿元竞得上海杨浦宅地,楼板价80199元/平方米