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

vue3 为什么需要toRef和toRefs

为什么在vue3中需要 toRef和toRefs?

先给一个最直接的答案:这是响应式设计语言最底层上的根源缺陷(天生自带)。所以 toRef和toRefs就是为了弥补js语言而不得不打的补丁。

下面深入看一下为什么

一、JS 的值传递机制,破坏了Proxy的拦截

总所周知,js数据类型分为基本数据类型和引用数据类型,基本数据类型的值直接在栈内存中存储而引用数据类型存储在堆中并且变量保存的是地址不是原始值。搞清楚这一点后来看一下 解构的执行逻辑。js中不管对方是基本数据类型还是引用数据类型,解构起到的是搬运操作

对于基本数据类型:

  • 基本类型直接存储在栈内存(Stack)中,占据固定大小的空间。解构时先得到该值所在位置
  • 然后JS 引擎在栈内存中开辟一块全新的空间,把这个要解构的值复制进去。新变量指向这个新空间。
  • 修改新变量,绝对不会影响源对象中的属性

对于引用数据类型:

  • 引用数据类型存储在堆内存(Heap)中,占据不定大小空间;栈内存只存一个指向堆内存的指针(内存地址)。
  • 解构时引擎取出的是栈中的指针地址(比如 0xFF01)。把这个地址复制给新变量
  • 新变量 b 和源对象属性指向堆内存中的同一块地址。因此修改新变量中数值,源对象中也会变

示例: 对 state 进行解构

conststate=reactive({count:0,name:'Vue'});const{count,name}=state;

根据解构原理来说 因为count 和name都是基础数据类型所以解构出来的 count和name 都是新值,所以原来的proxy代理不生效。为了解决这个问题 vue3 引入了toRef 来解决,来看一下简易源码

classObjectRefImpl{getvalue(){// 每次你访问 .value,我都去源对象上读取最新值returnthis._object[this._key];}setvalue(newVal){// 每次你设置 .value,我都去修改源对象this._object[this._key]=newVal;}}

可以看出使用 toRef后之所以还能够保持响应式得主要原因,toRef返回的根本不是响应式数据,而是一个指向源对象属性的引用

再来看下toRefs

exportfunctiontoRefs<Textendsobject>(object:T):ToRefs<T>{// 如果不是 reactive 对象,开发环境会警告,但依然可以工作constresult:any=Array.isArray(object)?newArray(object.length):{};// 遍历对象的所有 keyfor(constkeyinobject){// 对每个 key 执行 toRef,建立映射result[key]=toRef(object,key);}returnresult;}

其实toRefs就是批量执行了toRef,把对象得所有属性变成ref。有了toRefs,我们就能够很方便的构造出usexxx函数

setup(){functionuseInfo(){conststate=reactive({count:0,name:'Vue'});// 返回时用 toRefs 包裹,模板中就可以直接写 {{ count }},无需写 state.countreturn{...toRefs(state)};}const{count,name}=useInfo();}
http://www.jsqmd.com/news/1309528/

相关文章:

  • 【单片机毕业设计】基于 MPU6050 的人体姿态安全监测终端开发 基于 STM32 的环境光照自适应照明控制系统(018001)
  • 孤能子视角:EIS安全论看国家总体安全观、统筹发展与安全
  • 10分钟学会用SIMD-Visualiser调试SIMD代码:新手必备的可视化排错技巧
  • 2026年节能极窄门窗厂家选型推荐:大宅极简门窗定制厂家盘点 - 海棠依旧大
  • 终极Windows屏幕捕获指南:如何用Python实现240FPS高性能截图
  • 34-数据科学-数据分析与可视化
  • 欧卡2自动驾驶革命:ETS2LA如何让长途驾驶变得轻松有趣
  • 5分钟掌握Reloaded-II:跨平台游戏模组加载神器
  • C++编译错误no matching function for call to的深度解析与实战排查指南
  • 100% 成本清零!行业通用表述不侵权,跨境版权 TRO 应诉复盘!
  • 惠州黄金回收正规商家评测:惠奢汇(惠城旗舰店)凭双资质领跑,附避坑指南 - 生活测评小能手
  • 快速生成奶茶创意海报:低成本做出治愈系广告素材
  • 从入门到精通:fuzzyjoin的7种连接模式全攻略
  • 终极指南:DankDroneDownloader - 重新掌控你的无人机固件自由
  • 2026重庆节能极窄门窗服务商推荐,意式极简系统门窗、大宅门窗定制选择指南 - 海棠依旧大
  • CC Switch:AI编程工具管理的终极解决方案,告别繁琐配置的完整指南
  • OpenMetadata数据血缘追踪架构解密:构建企业级数据治理的核心引擎
  • Python定时邮件发送实战:从SMTP协议到APScheduler完整实现
  • YOLOv3+SORT组合有多强?multi-object-tracker实战案例分享
  • 软件起名套路多,惠州手工取名服务教你精准避坑 - 米諾
  • 当噪音学会退场——解码 A-59P 模组背后的“声学四重奏”
  • GitHub_Trending/skills3架构优化:突破AI技能执行瓶颈的深度解析
  • 四件套安全与检测维度:贴身盖 8 小时的东西,凭什么让你放心 - qiqi1113
  • 2026年重庆节能系统门窗服务商推荐,极简极窄门窗、高端家装门窗、全屋门窗定制选择指南 - 海棠依旧大
  • SN65HVD230 CAN收发器模块:从原理到实战的嵌入式通信指南
  • 电热风幕能挡住室外冷空气吗?
  • 被子总往一边跑?四件套的这些细节工艺,才是日常体验的分水岭 - qiqi1113
  • 制作AI短剧需要多少算力?从一条生产链看云算力平台怎么选
  • 2026 琼海博鳌注册公司财税服务商 TOP3!本地注册财税代办哪家好?众致财税优先推荐 - 米諾
  • BepInEx插件框架:从入门到精通的Unity游戏扩展指南