You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Vue动态表格嵌套插槽中获取slotProps并渲染自定义按钮?

动态表格自定义插槽渲染与数据传递问题解决

问题描述

拆分Table与Col为独立组件,将Col作为Table的插槽使用时,最后一个Col内的自定义插槽按钮无法渲染,且无法通过slotProps获取行数据content。

解决方案

1. 修正DynamicTable的插槽识别逻辑

修改DynamicTable的JS代码,正确捕获Col组件内部的自定义插槽:

const slots = useSlots()?.default || [];
const body = ref([])

slots.forEach(slot => {
  // 获取Col组件内部的content插槽
  const contentSlot = slot.type.slots?.content;
  body.value.push({
    slot: contentSlot,
    name: slot.props?.td,
  })
})

2. 调整DynamicTable的模板渲染方式

将原来的<slot>调用改为用<component>渲染捕获到的插槽,并传递行数据:

<slot></slot>

<div v-for="content in contents" :key="content.id">
   <div v-for="(td, idx) in body" :key="idx">
      <!-- 渲染自定义插槽并传递content数据 -->
      <component v-if="td.slot" :is="td.slot" :content="content"></component>
      <!-- 渲染动态列数据 -->
      <span v-else>{{ content[td.name] }}</span>
   </div>
</div>

3. 主文件与Col组件保持原有写法不变

主文件中Col的用法无需修改:

<DynamicTable :contents="contents">
  <Col th="name" td="name"/>
  <Col th="information" td="information"/>

  <Col>
    <template #content="slotProps">
      <button @click="getData(slotProps.content)">click me</button>
    </template>
  </Col>
</DynamicTable>

Col组件的render返回null的写法保持不变,不影响插槽传递。

修改说明

  • 原逻辑错误地将Col组件的children当作插槽内容,实际上需要通过slot.type.slots获取Col内部定义的插槽。
  • 使用<component>渲染捕获到的插槽,能正确传递content数据到自定义插槽的slotProps中,实现按钮渲染与数据获取。

内容的提问来源于stack exchange,提问作者yvl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:50:40