尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

vue3 为什么需要toRef和toRefs

vue3 为什么需要toRef和toRefs
📅 发布时间:2026/8/1 22:15:42

为什么在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();}

相关新闻

  • 100% 成本清零!行业通用表述不侵权,跨境版权 TRO 应诉复盘!
  • CC Switch:AI编程工具管理的终极解决方案,告别繁琐配置的完整指南
  • 快速生成奶茶创意海报:低成本做出治愈系广告素材

最新新闻

  • PCF8574 IO扩展板实战:I2C总线扩展GPIO的硬件原理与软件驱动详解
  • Python模块:内置模块math数学运算全解
  • 外贸销冠如何转型为管理者?林芳老师分享3个关键跃迁 - 外贸圈集团
  • 从Arduino UNO到PLUS:硬件升级与生态兼容设计全解析
  • CentOS安装Docker记录
  • 思源宋体CN:7种字重开源中文字体完全配置指南

日新闻

  • ClickHouse版本管理深度实战:4步构建零风险升级与回滚体系
  • Java 23 种设计模式:从踩坑到精通 | 番外:责任链模式 —— 物流审批流程实战
  • 华硕笔记本性能解放指南:G-Helper轻量级控制工具全面解析

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • ClickHouse版本管理深度实战:4步构建零风险升级与回滚体系
  • Java 23 种设计模式:从踩坑到精通 | 番外:责任链模式 —— 物流审批流程实战
  • 华硕笔记本性能解放指南:G-Helper轻量级控制工具全面解析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号