当前位置: 首页 > 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.dtcms.com/a/182807.html

相关文章:

  • 居然智家亮相全零售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)管理文化
  • AtCoder AT_abc405_d ABC405D - Escape Route
  • 使用FastAPI和React以及MongoDB构建全栈Web应用03 全栈开发快速入门
  • 每日脚本学习5.10 - XOR脚本
  • 论敏捷软件开发及其应用
  • 关于web3
  • PyTorch API 2 - 混合精度、微分、cpu、cuda、可视化
  • 模拟太阳系(C#编写的maui跨平台项目源码)
  • Maven 插件配置分层架构深度解析
  • 3.优惠券秒杀
  • 8051模板移植