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

Vue 3中如何结合v-for循环使用Slot?传递循环数据方法

Vue3 子组件v-for结合Slot传递循环数据(表格场景)

原代码的关键问题

  • 子组件插槽绑定变量错误:循环的是delay,但绑定了不存在的delaysBody,应该传递当前循环的单个delay对象
  • 插槽名称不匹配:子组件插槽名是reasonBody,父组件用的是delaysBody,导致插槽无法匹配
  • 表格结构违规:父组件插槽里用<div>包裹<td>,不符合HTML表格规范(<td>必须直接作为<tr>的子元素)
  • 冗余循环:父组件无需再做v-for,子组件已经在循环生成<tr>,每个插槽对应单个数据项

正确实现方案

核心思路:子组件在v-for循环中,将当前迭代的单个数据项绑定到插槽,父组件通过插槽接收该数据项并渲染对应内容。

子组件(示例:TableComponent.vue)

<template>
  <table border="1">
    <tbody>
      <!-- 循环父组件传入的body数组,每个item为单个delay对象 -->
      <tr v-for="delay in body" :key="delay.id">
        <td>{{ delay.id }}</td>
        <!-- 定义具名插槽,绑定当前循环的delay对象(自定义命名为delayItem) -->
        <slot name="reasonBody" :delayItem="delay"></slot>
      </tr>
    </tbody>
  </table>
</template>

<script setup>
// 接收父组件传入的表格数据数组
defineProps(['body'])
</script>

父组件

<template>
  <TableComponent :body="delaysBody">
    <!-- 使用对应具名插槽,接收子组件传递的delayItem -->
    <template v-slot:reasonBody="{ delayItem }">
      <!-- 直接渲染<td>,使用传递过来的单个数据项 -->
      <td>{{ delayItem.reason }}</td>
    </template>
  </TableComponent>
</template>

<script setup>
import TableComponent from './TableComponent.vue'

// 模拟表格数据
const delaysBody = [
  { id: '1', reason: '交通拥堵' },
  { id: '2', reason: '设备故障' }
]
</script>

效果说明

子组件每生成一行<tr>,就会把当前行对应的delay对象通过插槽传递给父组件,父组件的插槽内容直接使用该对象渲染对应列,既保证了表格结构的合规性,也实现了循环数据的传递复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:05:25