当前位置:首页 > 科技  > 软件

诉诸 Vue 组合式 API 解构 Props

来源: 责编: 时间:2024-01-15 09:21:43 342观看
导读大家好,这里是大家的林语冰。响应式 API 赋予了组合式 API 一大坨可能性的同时,代码精简。虽然但是,我们应该意识到响应性的某些陷阱,比如丢失响应性。在本文中,我们将学习如何正确解构 Vue 组件的 props,使得 props 不会丢

大家好,这里是大家的林语冰。F7328资讯网——每日最新资讯28at.com

响应式 API 赋予了组合式 API 一大坨可能性的同时,代码精简。虽然但是,我们应该意识到响应性的某些陷阱,比如丢失响应性。F7328资讯网——每日最新资讯28at.com

在本文中,我们将学习如何正确解构 Vue 组件的 props,使得 props 不会丢失响应性。F7328资讯网——每日最新资讯28at.com

1. 解构 props

编译器宏 defineProps() 可以辅助读写提供给 <script setup> 中的组件的 props:F7328资讯网——每日最新资讯28at.com

图片图片F7328资讯网——每日最新资讯28at.com

上述示例中,props 是一个响应式对象,包含了提供给组件的 props。如果组件 props 变化了,props 响应式对象也会随之变化。F7328资讯网——每日最新资讯28at.com

读写 props 对象时,我们要做的第一件事可能是,解构 props 对象,然后读写各个属性。但当我学习 Vue 组合式 API 时,令我大吃一惊的是,解构的 props 丢失了响应性!F7328资讯网——每日最新资讯28at.com

让我们来看一个例子。下述组件 <EvenOdd :count="5"> 接受 count 属性作为数字,并显示一条消息,无论 count 是偶数还是奇数。F7328资讯网——每日最新资讯28at.com

在解构 props 对象 const { count } = defineProps() 之后,访问该 count 属性:F7328资讯网——每日最新资讯28at.com

图片图片F7328资讯网——每日最新资讯28at.com

单击几次增加按钮。您会注意到,尽管 count 属性不断累加,但 "The number is even" 消息始终保持不变。F7328资讯网——每日最新资讯28at.com

当解构 props 对象 const { count } = defineProps() 时,响应性就会丢失。F7328资讯网——每日最新资讯28at.com

响应性之所以会丢失,是因为在解构时 count 变异为具有原始值的变量(一个平平无奇的数字罢了)。但 Vue 的响应性不能直接作用于原始值:Vue 必须诉诸 ref 或响应式对象。F7328资讯网——每日最新资讯28at.com

粉丝请注意,在 Vue 中将原始值直接赋值给变量时要小心:此乃丢失响应性的前提。F7328资讯网——每日最新资讯28at.com

2. 解决方案 1:使用“props”对象

第一个显而易见的解决方案是,不要解构 props 对象,并使用属性读写器直接读写 props: props.count。F7328资讯网——每日最新资讯28at.com

图片图片F7328资讯网——每日最新资讯28at.com

上述示例中,读写 computed() 内的 props.count 可以在 props.count 变更时保留响应性。props 对象是响应式的,对其进行任何变更都会被正确追踪。F7328资讯网——每日最新资讯28at.com

这种方案的短板是,我们必须始终使用属性读写器(比如 props.count)来读写 <script setup 中的 prop。F7328资讯网——每日最新资讯28at.com

解决方案 2:使用 toRefs() 辅助函数

如果您阅读至此,我敢打赌您是解构赋值的忠实粉丝,并且没有它就活不下去。F7328资讯网——每日最新资讯28at.com

问题不大,那么您可以有意识地将 props 对象的每个属性转换为 ref,来保留解构 props 的响应性。Vue 提供了一个特殊的辅助函数 toRefs(reactiveObject) 来精准完成此操作。F7328资讯网——每日最新资讯28at.com

其工作机制如下:F7328资讯网——每日最新资讯28at.com

图片图片F7328资讯网——每日最新资讯28at.com

toRefs(props) 返回一个对象,其中每个属性都是对相应 prop 的 ref。F7328资讯网——每日最新资讯28at.com

现在解构 const { count } = toRefs(props) 是安全的,因为 count 是基于 count 属性的 ref。现在,每次 count 属性变更时,count 的 ref 都会响应属性更改。F7328资讯网——每日最新资讯28at.com

将 count 作为 ref,在 computed() 内,我们必须使用 count.value 读写 prop 的值(因为 count.value 是我们读写 ref 的值的方式)。F7328资讯网——每日最新资讯28at.com

我发现此方案可以方便地将 prop ref 作为参数传递给组合式函数:比如 useMyComposable(count),并且不会丢失响应性。F7328资讯网——每日最新资讯28at.com

否则,我会坚持之前的方案,直接使用 props 对象读写 prop。F7328资讯网——每日最新资讯28at.com

4. 总结一下

粉丝请注意,通过应用解构 const { propA, propB } = defineProps(),我们会丢失 props 的响应性。F7328资讯网——每日最新资讯28at.com

解决响应性丢失的方案主要有两种:F7328资讯网——每日最新资讯28at.com

不解构 props,而是诉诸属性读写器直接读写 props:比如 props.xxx/props.cat。F7328资讯网——每日最新资讯28at.com

有意识地使用 props 作为 refs 的对象:const { propA, propB } = toRefs(props)。这保留了解构后的响应性。然后我们可以将属性作为独立 ref 读写,比如 propsA.value/propB.value 等。F7328资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-60978-0.html诉诸 Vue 组合式 API 解构 Props

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 数据科学不可或缺的十个Python库,让你事半功倍

下一篇: Go语言常见错误—Any 没传递任何信息

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top