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

组件库二次封装——透传问题

属性和事件透传

属性和事件的透传需要借助一个内置 api $attrs

<my-input a="1" b="2" @change="() => {}" />
<template><div class="input-wrapper">输入框:<el-input v-bind="$attrs"></el-input></div>
</template><script lang="ts">
export default {mounted() {console.log("attrs", this.$attrs)}
}
</script>

在这里插入图片描述

但是这样直接使用 $attrs 透传的优先级会比组件自身的属性和事件优先级低。比如:

<template><div class="input-wrapper">输入框:<el-input v-bind="$attrs"></el-input></div>
</template><script lang="ts">
export default {props: ['a'],emits: ['change'],mounted() {console.log("attrs", this.$attrs)}
}
</script>

在这里插入图片描述

插槽透传

一般我们需要透传插槽的话,需要:

  <my-input v-model="text" ><template #prepend>prepend</template><template #append>append</template><template #suffix>suffix</template><template #prefix>prefix</template></my-input>
<template><div class="input-wrapper">输入框:<el-input v-bind="$attrs"><template #prepend><slot name="prepend"></slot></template><template #append><slot name="append"></slot></template><template #suffix><slot name="suffix"></slot></template><template #prefix><slot name="prefix"></slot></template></el-input></div>
</template>

在这里插入图片描述

这样写有一些问题,一是繁琐,二是可能传递的插槽个数不同,导致不同的渲染逻辑(业务要求)。所以我们需要使用 $slots 这个 api。

插槽的本质是一个函数。

  <my-input v-model="text" ><template #prepend>prepend</template><template #append>append</template></my-input>
<template><div class="input-wrapper">输入框:<el-input v-bind="$attrs"><template v-for="(_, name) in $slots" #[name]="scopedData"><slot :name="name" v-bind="scopedData"/></template></el-input></div>
</template><script lang="ts">
export default {mounted() {console.log("slots", this.$slots)}
}
</script>

在这里插入图片描述

ref 透传

在 vue 中 ref 是无法透传的,在 react 中可以通过 forwardRef 获取子组件。

所以我们只能将子组件内部的原组件库 ref 挂载到外部 二次封装的组件 ref 上。

<template><div class="input-wrapper">输入框:<el-input ref="elInput" v-bind="$attrs"><template v-for="(_, name) in $slots" #[name]="scopedData"><slot :name="name" v-bind="scopedData"/></template></el-input></div>
</template><script>
export default {mounted() {console.log("elInput", this.$refs.elInput)for (const elInputKey in this.$refs.elInput) {this[elInputKey] = this.$refs.elInput[elInputKey];}}
}
</script>
http://www.lqws.cn/news/126019.html

相关文章:

  • ESP32S3 LVGL超大字体
  • 【八股消消乐】如何解决SQL线上死锁事故
  • 缓存控制HTTP标头设置为“无缓存、无存储、必须重新验证”
  • Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据
  • QT开发技术【ffmpeg + QAudioOutput】音乐播放器
  • 前端判断内容文字是否溢出容器,创建临时元素来模拟文本实际宽度
  • Windows 12确认没了,Win11 重心偏移修Bug
  • kubernetes》》k8s》》kubectl proxy 命令后面加一个
  • Python爬虫实战:研究urlparse库相关技术
  • 艾利特协作机器人:重新定义工业涂胶场景的精度革命
  • 第5篇《中间件负载均衡与连接池管理机制设计》
  • HDFS分布式存储 zookeeper
  • 42、响应处理-【源码分析】-浏览器与PostMan内容协商完全适配
  • 第二章 2.2 数据存储安全风险之数据存储风险分析
  • flask功能使用总结和完整示例
  • MVCC理解
  • 证券交易柜台系统解析与LinkCounter解决方案开发实践
  • NLP学习路线图(二十三):长短期记忆网络(LSTM)
  • 2025最新Java日志框架深度解析:Log4j 2 vs Logback性能实测+企业级实战案例
  • Appium+python自动化(八)- 认识Appium- 下章
  • 【leetcode】9. 回文数
  • 如何通过RL真正提升大模型的推理能力?NVIDIA提出长期强化学习训练框架ProRL
  • 内网穿透之Linux版客户端安装(神卓互联)
  • K8S主机漏洞扫描时检测到kube-服务目标SSL证书已过期漏洞的一种永久性修复方法
  • Python IP可达性检测脚本解析
  • 蓝桥杯17114 残缺的数字
  • NPOI操作EXCEL文件 ——CAD C# 二次开发
  • 【Linux】Linux 环境变量
  • [3-02-01].第13节:三方整合 - Jedis客户端操作Redis
  • 【游戏科学】游戏开发中数学算法的核心与应用