Vue 3 slot/插槽继承使用方法示例(基于 Ant Design Vue)

news2025/1/5 18:34:36

目录

Vue 3 插槽继承使用方法示例(基于 Ant Design Vue)

实例演示

背景

问题

解决方案:插槽继承

如何解决

插槽继承的原理

实现步骤

1. 子组件:封装 EaAutoComplete.vue

说明:

2. 父组件:自定义插槽内容

说明:

3. 调试:对比原组件与新组件的插槽继承效果

​编辑

说明:

总结


Vue 3 slot/插槽继承使用方法示例(基于 Ant Design Vue)

实例演示

如图新组件继承自原组件,且可以使用原组件的插槽。示例组件为 a-auto-complete


背景

在开发 Vue 3 应用时,尤其是在使用 Ant Design Vue 等 UI 组件库时,我们经常需要封装和自定义第三方组件。为了使组件更加灵活和可重用,我们希望父组件能够灵活地控制子组件的内容,而不需要修改子组件的代码。Vue 的插槽继承机制提供了一个有效的解决方案,它使得父组件能够通过插槽动态传递内容给子组件,从而大大提高了组件的灵活性和复用性。

问题
  1. 父子组件之间的内容传递问题:子组件需要展示不同的数据和结构,但不希望每次修改子组件时都需要改动父组件。
  2. 自定义插槽内容:当父组件需要定制子组件的插槽内容时,如何避免直接修改子组件代码,且保持灵活性和可扩展性?
解决方案:插槽继承

Vue 3 提供了插槽继承机制,通过 $slotsv-bind="$attrs" 可以让子组件动态接受并渲染父组件的插槽内容。这种方式避免了对子组件的硬编码修改,增强了组件的复用性和灵活性。

如何解决
  • 封装子组件:子组件通过 v-bind="$attrs" 将父组件传递的所有属性(包括插槽)传递给 Ant Design Vue 的 a-auto-complete 组件,同时使用 $slots 机制来动态渲染父组件传递的插槽内容。
  • 父组件自定义插槽:父组件通过 #slotName 的方式传递插槽内容,自定义渲染方式,而无需对子组件进行改动。
插槽继承的原理
  1. 动态传递插槽:子组件不需要显式声明每个插槽内容,父组件只需要通过插槽名称来传递内容。子组件使用 $slots 来接收父组件传递的插槽数据,并通过 v-bind="$attrs" 将父组件的属性传递给实际的原生组件(如 a-auto-complete)。
  2. v-for 循环插槽:通过 v-for="(_, name) in $slots" 遍历父组件传递的插槽内容,子组件可以动态地渲染这些内容。这使得子组件能够无缝地继承并显示父组件传递的内容。
实现步骤
1. 子组件:封装 EaAutoComplete.vue

在子组件中封装 Ant Design Vue 的 a-auto-complete 组件,并使用插槽继承机制,将父组件传递的插槽内容动态渲染。

<script lang="ts" setup>
const props = defineProps({
  options: {
    type: Array,
    default: () => [{
      label: 'Option 1',
      value: 1,
    }, {
      label: 'Option 2',
      value: 2,
    }],
  },
})

const modelValue = defineModel<string, number>('value')
</script>

<template>
  <a-auto-complete
    v-model:value="modelValue"
    v-bind="$attrs"
    :options="props.options"
    placeholder="请输入"
  >
    <!-- 动态传递父组件插槽内容 -->
    <template v-for="(_, name) in $slots" #[name]="slotData">
      <slot :name="name" v-bind="slotData || {}" />
    </template>
  </a-auto-complete>
</template>
说明
  • 使用 v-bind="$attrs" 将父组件传递的所有属性(包括 v-model 和自定义属性)传递给 a-auto-complete 组件。
  • 使用 v-for="(_, name) in $slots" 遍历并渲染父组件传递的插槽内容。<slot :name="name" v-bind="slotData || {}" /> 将插槽内容传递给父组件,使得父组件能够灵活控制插槽的展示内容。
2. 父组件:自定义插槽内容

父组件可以通过插槽来控制子组件的显示方式。这里自定义了 #option 插槽,来渲染每个选项的名称和其他信息。

<script lang="ts" setup>
import EaAutoComplete from '~/components/EaAutoComplete.vue'

const props = defineProps({
  options: {
    type: Array,
    default: () => [{
      label: 'Option 1x',
      value: 1,
      name: 'Option 1x',
    }, {
      label: 'Option 2x',
      value: 2,
      name: 'Option 2x',
    }],
  },
})

const modelValue = defineModel<string, number>('value')
</script>

<template>
  <EaAutoComplete
    v-model:value="modelValue"
    v-bind="$attrs"
    :options="props.options"
    placeholder="请输入"
  >
    <!-- 自定义插槽:控制选项的展示方式 -->
    <template #option="item">
      <div style="display: flex; flex-direction: column;">
        <span> {{ item.name }} </span>
        <span style="color: #8c8c8c; font-size: 12px;">{{ String(item.value) }}</span>
      </div>
    </template>
  </EaAutoComplete>
</template>
说明
  • 在父组件中,使用 EaAutoComplete 并通过 #option 插槽自定义了每个选项的展示方式。
  • 父组件控制了选项内容的布局和显示,不需要对子组件 EaAutoComplete 进行任何修改。
3. 调试:对比原组件与新组件的插槽继承效果

通过调试组件,可以对比 EaAutoCompleteEa2AutoComplete 组件的效果。新组件通过插槽继承可以更灵活地自定义插槽内容。

<script setup lang="ts">
import EaAutoComplete from '~/components/EaAutoComplete.vue'
import Ea2AutoComplete from '~/components/Ea2AutoComplete.vue'
</script>

<template>
  <div style="display: flex;">
    <div>
      <p>原组件</p>
      <EaAutoComplete style="width: 200px; margin-right: 20px" />
    </div>
    <div>
      <p>新组件</p>
      <Ea2AutoComplete style="width: 200px; margin-right: 20px" />
    </div>
  </div>
</template>
说明
  • DebugComponent 展示了原始组件与新组件的对比。通过插槽继承机制,Ea2AutoComplete 可以动态接收并渲染父组件传递的插槽内容。
总结
  1. 动态插槽传递:Vue 3 的插槽继承机制允许子组件动态接收并渲染父组件传递的插槽内容,无需显式声明每个插槽。
  2. 提高组件复用性和灵活性:父组件可以通过插槽灵活地控制子组件的显示内容,而无需对子组件进行修改。插槽继承提高了组件的复用性,使得父组件可以独立修改插槽内容而不影响子组件。
  3. 降低耦合度:插槽继承降低了父子组件之间的耦合度,父组件可以根据需要自定义插槽内容,而不需要对子组件进行更改。

这种方式特别适用于需要高度定制化和灵活性的 UI 组件开发,尤其是在使用像 Ant Design Vue 这样的第三方组件库时,可以通过插槽继承来实现个性化的 UI 设计,同时保持组件的可复用性和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2270458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

成立一家无人机培训机构需要哪些基础配置

成立一家无人机培训机构&#xff0c;需要一系列基础配置来确保教学质量、学员安全以及机构的正常运营。以下是根据公开发布的信息整理出的关键基础配置&#xff1a; 一、场地配置 1. 飞行场&#xff1a;提供一个安全、宽敞的室外飞行环境&#xff0c;面积最好大于三千平米&…

【ACCSS】2024年亚信安全云认证专家题库

文件包含&#xff1a; 亚信安全ACCSS认证2019年真题&#xff08;1&#xff09; 亚信安全ACCSS认证2019年真题&#xff08;2&#xff09; 亚信安全ACCSS认证2019年真题&#xff08;3&#xff09; 亚信安全ACCSS认证2020年真题&#xff08;1&#xff09; 亚信安全ACCSS认证2020年…

探索 JMeter While Controller:循环测试的奇妙世界

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开循环测试的大门&#xff0c;模拟出各种各样复杂又有趣的场景哦&#xff01; 一、While 控制器初印象 想象一下&#xff0c;你…

麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本

12月26日&#xff0c;2024云计算产业和标准应用大会在北京成功召开。大会汇集政产学研用各方专家学者&#xff0c;共同探讨云计算产业发展方向和未来机遇&#xff0c;展示云计算标准化工作重要成果。 会上&#xff0c;云建设与应用领航计划&#xff08;2024&#xff09;建云用…

LeetCode算法题——螺旋矩阵ll

题目描述 给你一个正整数n&#xff0c;生成一个包含1到n2所有元素&#xff0c;且元素按顺时针顺序螺旋排列的n x n正方形矩阵matrix 。 示例 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]题解 思路&#xff1a; 将整个过程分解为逐圈填充的过程&#xf…

设计模式 创建型 原型模式(Prototype Pattern)与 常见技术框架应用 解析

原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;其核心思想在于通过复制现有的对象&#xff08;原型&#xff09;来创建新的对象&#xff0c;而非通过传统的构造函数或类实例化方式。这种方式在需要快速创建大量相似对象时尤为高效&#x…

word无法插入svg格式图片

插入后出现这样的窗口&#xff0c;表明word版本低&#xff0c;没有svg这个选项。 因此这就是区别。在b站找升级word视频。

mysql 报错 ERROR 1396 (HY000) Operation ALTER USER failed for root@localhost 解决方案

参考:https://blog.csdn.net/m0_74824534/article/details/144177078 mysql 修改密码 ALTER USER ‘root’‘localhost’ IDENTIFIED BY ‘123’; 时&#xff0c;报错 ERROR 1396 (HY000): Operation ALTER USER failed for rootlocalhost 解决方案&#xff1a; 2024-4-3 段子…

医学图像分割中故障检测方法的比较基准评测:揭示置信度聚合的作用|文献速递-视觉大模型医疗图像应用

Title 题目 Comparative benchmarking of failure detection methods in medical image segmentation: Unveiling the role of confidence aggregation 医学图像分割中故障检测方法的比较基准评测&#xff1a;揭示置信度聚合的作用 01 文献速递介绍 语义分割是医学图像分析…

线程-7-信号量

互斥访问高效从何谈起&#xff08;上节补充&#xff09; 效率要考虑整体效率 放/取数据时串行&#xff0c;但造数据/处理数据可以并行 多线程时&#xff1a;数据在交易场所中传输确实是互斥&#xff0c;串行的&#xff08;占比时间很短&#xff09; 但生产者获取数据与消费…

行业商机信息付费小程序系统开发方案

行业商机信息付费小程序系统&#xff0c;主要是整合优质行业资源&#xff0c;实时更新的商机信息。在当今信息爆炸的时代&#xff0c;精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览&#xff1a;用户在工作间隙或闲暇时间&#xff0c…

Vue 全局事件总线:Vue 2 vs Vue 3 实现

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

活动预告 |【Part2】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动&#xff0c;了解 Azure 如何为将工作负载…

Docker Compose 构建 EMQX 集群 实现mqqt 和websocket

EMQX 集群化管理mqqt真香 目录 #目录 /usr/emqx 容器构建 vim docker-compose.yml version: 3services:emqx1:image: emqx:5.8.3container_name: emqx1environment:- "EMQX_NODE_NAMEemqxnode1.emqx.io"- "EMQX_CLUSTER__DISCOVERY_STRATEGYstatic"- …

067B-基于R语言平台Biomod2模型的物种分布建模与数据可视化-高阶课程【2025】

课程培训包含&#xff1a;发票全套软件脚本学习数据视频文件导师答疑 本教程旨在通过系统的培训学习&#xff0c;学员可以掌握Biomod2模型最新版本的使用方法&#xff0c;最新版包含12个模型&#xff08;ANN, CTA, FDA, GAM, GBM, GLM, MARS, MAXENT, MAXNET, RF, SRE, XGBOOST…

USB 中断传输的 PID 序列

文章目录 中断传输的 PID 序列全速设备抓包高速设备抓包参考中断传输的 PID 序列 端点在初始化后,从 DATA0 开始,每成功执行一个事务,数据包序列翻转一次(从 DATA0 变为DATA1 或从 DATA1 变为 DATA0)。 数据翻转和传输的个数没有直接关系,只由端点在初始化后处理的总数决…

ESP32物联网无线方案,智能穿戴设备联网通信,产品无线交互应用

在物联网的世界里&#xff0c;每一个设备都不再是孤立的个体&#xff0c;它们通过无线连接芯片相互连接&#xff0c;形成一个庞大的智能网络。这些芯片是实现万物互联的基础&#xff0c;它们使得设备能够相互沟通&#xff0c;共享数据&#xff0c;从而创造出无限的可能性。 这…

C语言格式输出

1.转换字符说明&#xff1a; 2.常用的打印格式&#xff1a; 在 C 语言中&#xff0c;格式输出主要依靠 printf 函数来实现。以下是一些 C 语言格式输出的代码举例及相关说明。 printf("%2d"&#xff0c;123)&#xff0c;因为输出的部分有三位数&#xff0c;但是要求…

GJB系统设计说明模板

GJB系统设计说明模板及详解 1 范围 1.1 标识 1.2 系统概述 1.3 文档概述 2 引用文档 GJB XXX XXX XXX&#xff1b; XXX XXX。 前2章通用不再赘述 3 系统级设计决策 系统设计决策的目的:对系统规格说明中的关键需求(包括功能、质量属性和设计约束)进行分析,得到系统级概念性架构…

windows编译llama.cpp GPU版本

Build 指南 https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md 一、Prerequire 具体步骤&#xff08;以及遇到的坑&#xff09;&#xff1a; 如果你要使用CUDA&#xff0c;请确保已安装。 1.安装 最新的 cmake, git, anaconda&#xff0c; pip 配置pyt…