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

React求助:服务端取数后动态渲染双列表格

问题描述

我希望在React中将服务端获取的数据渲染成双列表格,期望的布局如下:

+----------+----------+----------+----------+
| Row 1               | Row 7               |
+----------+----------+----------+----------+
| Row 2               | Row 8               |
+----------+----------+----------+----------+
| Row 3               | Row 9               |
+----------+----------+----------+----------+
| Row 4               | Row 10              |
+----------+----------+----------+----------+
| Row 5               | Row 11              |
+----------+----------+----------+----------+
| Row 6               | Row 12              |
+----------+----------+----------+----------+

但目前我的代码渲染出的是单列表格:

+----------+----------+----------+----------+
| Row 1                                     |
+----------+----------+----------+----------+
| Row 2                                     |
+----------+----------+----------+----------+
| Row 3                                     |
+----------+----------+----------+----------+
| Row 4                                     |
+----------+----------+----------+----------+
| Row 5                                     |
+----------+----------+----------+----------+
| Row 6                                     |
+----------+----------+----------+----------+
| Row 7                                     |
+----------+----------+----------+----------+
| Row 8                                     |
+----------+----------+----------+----------+
| Row 9                                     |
+----------+----------+----------+----------+
| Row 10                                    |
+----------+----------+----------+----------+
| Row 11                                    |
+----------+----------+----------+----------+
| Row 12                                    |
+----------+----------+----------+----------+

数据量最多可能有20行,我的当前代码如下:

const data = [
  {Location:"NY", Seal: "loose"},
  {Location:"MD", Seal: "intact"},
  {Location:"DC", Seal: "good"},
  {Location:"KT", Seal: "bad"},
  {Location:"VI", Seal: "patty"},
  {Location:"WI", Seal: "broken"},
  {Location:"DT", Seal: "daily"},
  {Location:"PE", Seal: "weekly"}
]

<table>
  <tr>
    {data?.map(
      (item, index) => (
        <div key={index}>
          <td>
            <p>
              ID <b>{index + 1}</b>:
              Location # <b>{item["Location"]}</b>
              Seal # <b>{item["Seal"]}</b>
            </p>
          </td>
        </div>
      )
    )}
  </tr>
</table>
解决方案

当前代码存在两个核心问题:

  1. 所有<td>被放在同一个<tr>中,导致内容无法按双列排布
  2. 在<table>内部使用<div>,违反HTML表格规范,破坏了表格结构

要实现目标双列布局,需将数据拆分为左右两栏,逐行配对生成表格行,每一行包含左右两个单元格。修改后的代码如下:

const data = [
  {Location:"NY", Seal: "loose"},
  {Location:"MD", Seal: "intact"},
  {Location:"DC", Seal: "good"},
  {Location:"KT", Seal: "bad"},
  {Location:"VI", Seal: "patty"},
  {Location:"WI", Seal: "broken"},
  {Location:"DT", Seal: "daily"},
  {Location:"PE", Seal: "weekly"}
]

// 计算数据分割点,处理奇数行时左栏多一行的情况
const splitIndex = Math.ceil(data.length / 2);
// 拆分数据为左右两栏
const leftColumn = data.slice(0, splitIndex);
const rightColumn = data.slice(splitIndex);

return (
  <table>
    {leftColumn.map((item, index) => {
      const rightItem = rightColumn[index];
      return (
        <tr key={index}>
          {/* 左栏单元格 */}
          <td>
            <p>
              ID <b>{index + 1}</b>:
              Location # <b>{item.Location}</b>
              Seal # <b>{item.Seal}</b>
            </p>
          </td>
          {/* 右栏单元格,存在数据时才渲染 */}
          {rightItem && (
            <td>
              <p>
                ID <b>{splitIndex + index + 1}</b>:
                Location # <b>{rightItem.Location}</b>
                Seal # <b>{rightItem.Seal}</b>
              </p>
            </td>
          )}
        </tr>
      );
    })}
  </table>
);

关键说明

  • 通过splitIndex将数据拆分为左右两部分,确保奇数行时左栏自动多一行
  • 遍历左栏数据,每一行生成一个<tr>,包含左右两个<td>,右栏无数据时不渲染空单元格
  • 移除了不符合表格规范的<div>标签,保证HTML结构合法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 11:27:34