vue透传

article/2025/9/27 17:13:27

太香了

背景介绍

透传是一个通讯层面的概念,指的是在通讯中不管传输的业务内容如何,只负责将传输的内容由源地址传输到目的地址,而不对业务数据内容做任何改变。

其实透传这个概念,我最早是从上面一个领导那里听到的,由于他是电气工程师出身,而硬件通讯这块用到透传还是挺多的。

图片

当我听到透传这个词后,我感觉有那么一点熟悉感,仔细想想后我发现,其实我们前端也一直在使用透传,特别是在做基础封装时。

透传在前端的应用

今天就用一个Vue基础组件封装的过程为例,来简单聊聊什么是透传。

相信不少前端er做项目都会用到组件库,是ElementUI还是Ant Design,这都不重要。然后我们又希望在第三方组件库的基础上再做一点点定制。

举个例子,el-button有个属性是size,用于控制按钮组件的尺寸。

属性说明类型可选值默认值
size尺寸Stringmedium / small / mini-

图片

可以看到,默认size是比较大的。然而我们设计师基于组件库出自己的设计方案时,其实选择的默认按钮尺寸可能恰好对应ElButtonmedium尺寸,或者是其他值。这样一来,如果我不对el-button做封装,每个使用el-button的地方都要多写一个属性size,类似于这样:

// pageA.vue
<el-button size="medium">按钮1</el-button>
<el-button size="medium">按钮2</el-button>// pageB.vue
<el-button size="medium">按钮3</el-button>
<el-button size="medium">按钮4</el-button>

很明显,每使用一次el-button,我就要写一个size属性,好烦啊!

图片

是的,确实很烦,那么怎么解决呢?答案是提供一个编程接口,去改变组件的默认值。有这方面考虑的组件设计者一般会提供一个设置默认值的接口,比如xxx.setDefault(options)。那么ElementUI和Ant Design有没有提供这样的能力呢?据我观察好像是没有,其实主要是因为Vue没有一个方便的途径去修改propdefault属性。但是没有方便的途径并不代表没有途径...

图片

由于本文的主题是透传,所以就不说那个途径(或者说方法)了,有点跑偏了。

网友小王说:“好,那就硬上,封装一个组件!”

好的,马上安排!基本思路是封装一个自定义组件,组件里面再调用el-button,并且强行给el-button安排上默认属性size="medium"

<template><el-button :size="size"><slot /></el-button>
</template><script>
export default {name: "MyButton",props: {size: {type: String,default: 'medium'}}
}
</script>

聪明的读者一看就发现了,这个组件问题很大,除了size属性,其他属性和事件怎么处理完全没

小王说:“没事,您需要什么?我给安排上!”

于是,这个组件最后就慢慢变成了:

<template><el-button:size="size":type="type":disabled="disabled"@click="onClick"><slot /></el-button>
</template><script>
export default {name: "MyButton",props: {size: {type: String,default: "medium",},type: {type: String,default: "primary",},disabled: Boolean,},methods: {onClick() {this.$emit("click");},},
};
</script>

看起来有点糟心,这组件甚至会更冗余,更复杂,因为我这里只加了3个prop和1个event。对于稍微复杂一点的组件来说,prop加上event一共几十个是随随便便的吧!你适配得过来吗?而且,不少人还有代码洁癖吧,这简直受不了!

图片

淡定淡定!这当然是有办法解决的。强如框架的设计者尤小右自然早已想到了这个场景,所以你应该在Vue官网文档中关注到inheritAttrs[1]。

如何理解inheritAttrs(默认值为true)这个选项呢?我们知道,一个组件如果要接受父组件传来的属性,是需要先在props里面预定义好的。比如前面的例子,我在MyButton预定义了3个属性,分别是sizetypedisabled,意思是MyButton这里只接受3个prop

那么假设父组件传了4个或者更多prop过来呢,会怎么样?看下面这个例子:

<template><my-buttontype="success"disabledroundnative-type="submit">测试</my-button>
</template>

实际上,roundautofocus都不是MyButton组件支持的prop,所以反映到HTML上是这么一个效果:

图片

作为使用者,我们应该是希望roundnative-type="submit"能够传到el-button,产生应有的效果。然而,roundnative-type="submit"仅仅是挂在了根元素的attribute上,并没有真正起到应有的作用!

PS:举个例子,round属性作用到el-button能让button带一个is-roundclass,从而产生圆角效果!

也就是说,inheritAttrs的作用是:使那些没有在props中定义的属性,直接以attribute的形式作用在组件的根元素上!

那么roundnative-type="submit"如何透传下去呢?

首先,不能让那些未被props标识的属性直接落到根元素上,所以需要设置inheritAttrsfalse

然后,要获取到那些未被props标识的属性,并直接绑定到el-button。恰好,Vue提供了$attrs[2]用于获取这些属性,而v-bind本身就能绑定一个对象,这是容易被我们忽略的!

处理完属性透传,接下来我们还要处理事件,类似于$attrs$listeners也能把父组件中对子组件的事件监听全部拿到,这样我们就能用一个v-on把这些来自于父组件的事件监听传递到下一级组件。

看图可能会更好理解!

图片

相当于MyButton是一个不赚差价的中间商,直接透传消息!直观上看,组件代码量有一个明显的减少,更重要的是扩展性和可维护性变得更强!

<template><el-buttonv-bind="customizedAttrs"v-on="$listeners"><slot /></el-button>
</template><script>
export default {name: "MyButton",inheritAttrs:false,props: {size: {type: String,default: "medium",},},computed: {customizedAttrs() {return {size: "medium",// 支持传过来的size覆盖默认的size...this.$attrs,};},},
};
</script>

对于调用者来说,使用体验是完全没有被影响的,他的感觉就好像仍然在直接使用el-button,属性传递和事件监听的使用体验都没有任何变化!

<template><my-buttontype="success"roundautofocus@click="handleClick"/>
</template>

总结

结合inheritAttrsv-bind以及v-on,我们就实现了一个支持透传的基础组件!本文是以Button组件为例,做的关于透传的入门介绍。实际上,透传的应用范围远远不止Button组件,利用透传的技巧,我们能做更多漂亮的事情!现在,你的代码洁癖还好吗?

图片

参考

[1]

inheritAttrs: https://cn.vuejs.org/v2/api/#inheritAttrs

[2]

$attrs: https://cn.vuejs.org/v2/api/#vm-attrs


http://chatgpt.dhexx.cn/article/W8R0rXqf.shtml

相关文章

Ra-08透传固件应用

目录 1、功能介绍2、硬件接线3、固件烧录4、应用说明指令说明指令使用示例应用示例 5、联系我们 1、功能介绍 Ra-08透传固件主要功能有&#xff0c;设置发送或者接收模式&#xff0c;配置各个射频参数&#xff0c;设置本地地址与发送的目标地址&#xff0c;设置进入睡眠模式等…

EC800G透传模式

透传&#xff1a;指与传输网络的介质、调制解调方式、传输方式、传输协议无关的一种数据传送方式。1.准备 安信可透传云http://netlab.luatos.com/ QCOM_V1.6 LTE Standard TCP/IP 应用指导 2.AT指令格式介绍 2.1场景配置 该命令可用来配置、、以及其他TCP/IP 场景参数。Qo…

【无线通信】一文讲透串口透传

而随着万物互联的深入&#xff0c;想要实现智能设备的通信&#xff0c;串口透传就是一种非常高效的通信方式。 ** 什么是串口透传&#xff1f; ** 透传&#xff1a;透明传输&#xff08;SerialNet&#xff09;。即在传输过程中&#xff0c;对外界透明&#xff0c;不管所传输的…

ESP8266配置透传模式(AT指令)

ESP8266使用AT指令的前提是模块已烧录AT固件&#xff0c;固件可以在官网下载&#xff0c;固件烧录这里也直接略过&#xff0c;可以参考其他博文 AT指令恢复出厂设置 用AT指令将ESP8266恢复出厂设置&#xff08;因为之前配置了什么也不确定&#xff0c;直接恢复出厂&#xff09…

透传,无线透传

透传: 透传&#xff0c;即透明传输&#xff0c;指的是在通讯中不管传输的业务内容如何&#xff0c;只负责将传输的内容由源地址传输到目的地址&#xff0c;而不对业务数据内容做任何改变。 无线透传模块&#xff1a; 透明传输模块&#xff0c;透明传输就是在传输过程中&#x…

关于ESP8266的透传模式测试(一)——TCP Client透传模式

一、前言 本次测试所使用的是正点原子的ATK-ESP8266 WIFI模块。直接使用官方提供的固件使用AT指令来配置模块并使用。 模块默认为AT指令状态&#xff0c;模拟波特率为115200&#xff08;8bit数据位&#xff0c;1bit停止位&#xff09;。 硬件连接 使用USB转TTL方式&#xf…

一文了解透传云基础知识

一文了解透传云基础知识 一&#xff1a;透传云定义&#xff0c; 首先了解下透传的定义 透传&#xff1a;透明传输。即在传输过程中&#xff0c;不管所传输的内容、数据协议形式&#xff0c;不对数据做任何处理&#xff0c;只是把需要传输的内容数据传输到目的。 透传云&#xf…

一个网工的十年奋斗史 - 移民篇

我在茶余饭后总能听到&#xff1a;某同事出国以后的生活多好&#xff0c;什么时候买了个别墅大house&#xff0c;什么时候晒了一下蓝天白云没有雾霾&#xff0c;让人羡慕不已。 可是我们也同样忽略了移民背后的努力和艰辛。殊不知对于移民的人来说&#xff0c;需要舍弃很多。试…

准备全面转入SAP和SOA领域

同事跑过来说他撞死了一只袋鼠。 为什么什么事都有&#xff1f; Whatever... 这周5最后一天工作&#xff0c;除了今天早上工作紧张点&#xff0c;已经完全没有什么事情了。爽死了&#xff0c;终于可以不工作了&#xff0c;可以天天在家睡大觉啦。哈哈哈。真是工作后才知道…

天使投资人给阿里新贵们的一些建议

作者曾为 Facebook 早期员工&#xff0c;现为天使投资人。 这几天被阿里的同志们的喜事刷屏&#xff0c;让我想起来当年 Facebook 上市的场景。都是一个众望所归的 IPO&#xff0c;但 Facebook 弄砸了&#xff0c;阿里很成功&#xff01; Congratulations&#xff01; 当然&…

在淘宝做前端的这三年 — 第三年

关注“重度前端” 专注前端、专注全栈、输出价值 助力前端深度学习 ━━━━ 更加深入内容发布业务 自从去年掌握了一些业务分析方法&#xff0c;今年工作更喜欢做业务了。由于阿里员工自己不能开淘宝帐号运营&#xff0c;所以我开了个公众号做竞品调研&#xff0c;站在一个创…

【转载】大龄码农的新西兰移民之路

大龄码农的新西兰移民之路 【转载】博主地址&#xff1a;https://www.cnblogs.com/yanxiaodi/p/MoveToNewZealand.html 最近一年没怎么发博客&#xff0c;确实在忙一件事情——移民新西兰。如今已顺利入职&#xff0c;新西兰绿卡正在申请过程中&#xff0c;终于有时间将最近一年…

ENVI波段合成逆运算——波段拆分

APP Store中查找工具&#xff0c;第8页“将多波段图像拆分成多个单波段文件 V5.3”。 点击 Install App安装插件。重启ENVI后&#xff0c;可以看到Toolbox / Extensions下有Split to Multiple Single-Band Files工具。 ENVI中打开需要进行波段拆分的文件。 点击Split to Multi…

遥感基础——红外波段分类

红外波长的分类 红外线是波长介乎微波与可见光之间的电磁波&#xff0c;波长为0.75&#xff5e;1000 μm&#xff0c;其中&#xff0c;近红外、短波红外、中波红外、长波红外所在区间如下&#xff1a; - 近红外 (Near Infrared, NIR) : 0.75~1.1 μm - 短波红外 (Short …

频段划分

电磁波频段的划分 射频&#xff08;300KHz-300MHz&#xff09;&#xff1a;包括LF&#xff0c;MF&#xff0c;HF&#xff0c;VHF 微波&#xff08;300MHz-3000GHz&#xff09;&#xff1a;包括UHF&#xff0c;SHF&#xff0c;EHF&#xff0c;PHF 微波频段的划分 波段频率范围…

雷达篇(四)雷达工作波段

目录 1、简介 2、波段划分 3、各波段雷达功能 4、波长计算公式 1、简介 不同波段电磁波的传播方式和特点各有不同&#xff0c;所以它们的用途也不同。电磁波段划分如图 1所示。 在雷达行业&#xff0c;雷达工作频率划分成为若干波段&#xff0c;由低到高的顺序依次是高频&a…

指数波段划分以及底部反弹行业特征统计分析

本文参考国金证券杨勇博士最近发的研报《底部反弹特征统计分析》&#xff0c;在优矿网做一个分析实现。 首先是作出指数的波段划分图&#xff0c;用以确定指数的各个底部。 1 import numpy as np 2 import pandas as pd 我写了如下一个函数&#xff0c;可以用于划出各个指数的波…

频谱和波段划分

光是一种电磁波。 可见光&#xff1a;由光源发出的辐射能中的一部分&#xff0c;即能产生视觉的辐射能&#xff0e;常被称作为“可见光”。 可见光的波长&#xff1a;从380nm----780nm 紫外线的波长&#xff1a;从100nm---380nm&#xff0c;肉眼看不见。 红外线的波长&#xff…

电磁波频谱 和 波段划分以及名称由来(收集)

电磁波频谱和波段划分 段号 频段名称 频段范围 &#xff08;含上限&#xff0c;不含下限&#xff09; 波段名称 波长范围 &#xff08;含上限&#xff0c;不含下限&#xff09; 1 极低频(ELF) 3&#xff5e;30赫&#xff08;Hz&#xff09; 极长波 100&#xff5e;10兆米 2 超低…

【图像处理】多光谱 波长波段划分 主要波段特性 植被遥感原理 典型植被指数

他们仅仅看到自我的影子&#xff0c;他们的影子就是他们的法律。太阳对他们来说&#xff0c;只是个投影者。 文章目录 前言 前言 本文记录多光谱波段划分&#xff0c;主要波段特性&#xff0c;植被遥感原理&#xff0c;典型植被指数。 资料参考&#xff1a; 冈萨雷斯-数字图像…