vue3中的父子组件传递slot的方式

缘起

目前的 vue3 工程,有处相似的地方,上面是一个 a-step 组件,下面是一个 vxetable 的组件,目前有好几处都是各自复制这两个组件,进行各自的处理。所以就要把这处,改成一个组件,供小伙伴们使用。

分析

大组件套了两个小组件是没有问题的,但是卡在一个地方,vxetable 的组件,可能会使用多个具名插槽。所以意思就是说,在父组件的具名插槽,需要原样传递给子组件,然后子组件里面需要把这个插槽,再原样传递给 vxetable 的组件,最终就达到这么一个效果。

实现

父组件

javascript 复制代码
<parentCom title="标题名字" :statusConfig="statusConfig" :tableConfig="tableConfig">

    <template #slotName="{ row }">

        <span v-if="row.name">{{ row.name }}</span>

        <a class="a-link" v-else>选择</a>

    </template>

    <template #slotName2="{ row }">

        <span v-if="row.name2">{{ row.name2 }}</span>

        <a class="a-link" v-else>选择</a>

    </template>

</parentCom>

子组件

html 复制代码
<div class="process-box">

  <div class="title">

    <span class="left">{{ props.title }}</span>

  </div>

  <div class="step-box">

    <stepCom :statusConfig="props.statusConfig"></stepCom>

  </div>

  <div style="width: 100%; height: 290px">

    <tableCom :tableConfig="props.auditTableConfig">

      <!-- 这里就是最重要的部分 -->

      <template v-for="(slot, name) in $slots" :key="name" #[name]="{ row }">

        <slot :name="name" :row="row"></slot>

      </template>

    </tableCom>

  </div>

</div>

总结

需要加上一个 template 标签,然后循环所有的插槽,然后把插槽的 name,和 row 传递给子组件,子组件再把这个插槽原样传递给孙组件。

javascript 复制代码
<template v-for="(slot, name) in $slots" :key="name" #[name]="{ row }">

  <slot :name="name" :row="row"></slot>

</template>
相关推荐
红尘散仙1 小时前
谁说终端只能敲键盘?我用 Rust 给小说阅读器加上了鼠标
前端·后端·rust
Penge6662 小时前
《Go 后端开发者学 React:组件通信与插槽》
javascript
陈随易3 小时前
C++26 草案被否,二十八年来头一回
前端·后端·程序员
ZhengEnCi3 小时前
Agent 工具怎么折叠海量输出才「爽」:Trae、Claude Code 的渐进式披露设计原理
前端·agent
Penge6663 小时前
《Go 后端开发者学 React:useState》
javascript
Penge6663 小时前
《Go 后端开发者学 React:数据渲染》
javascript
IT_陈寒6 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端
ikoala6 小时前
让 Codex 自己查账:一个省 token 的小技巧
前端·后端·ai编程
ikoala6 小时前
AI 写页面像说明书,修 Bug 像贴膏药?把这两句话写进 AGENTS.md
前端·javascript·ai编程
Penge6667 小时前
《Go 后端开发者学 TypeScript:ES Module了解》
javascript