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

如何使用*ngFor、*ngIf在HTML表格中实现每行展示4个键值对

解决方案

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

  • 每组键值对都单独生成了<tr>标签,导致每行只能显示1组
  • <div>直接作为<table>的子元素不符合HTML表格规范,会触发浏览器异常渲染

推荐用TS层预处理数组的方案实现,逻辑清晰性能也更好,调整步骤如下:

步骤1:组件ts中新增分块处理逻辑

把原本一维的Map键值对数组,按4个为一组转成二维数组:

// 加到你的app.component.ts中
get chunkedUiFields(): Array<Array<{key: string, value: any}>> {
  // 先把Map转成key-value格式的一维数组
  const keyValueList = Array.from(this.uiFields.entries()).map(([key, value]) => ({ key, value }));
  const chunkSize = 4;
  const result = [];
  // 按每组4个切割数组
  for (let i = 0; i < keyValueList.length; i += chunkSize) {
    result.push(keyValueList.slice(i, i + chunkSize));
  }
  return result;
}

步骤2:调整模板HTML代码

移除不规范的div嵌套,先循环行再循环每行内的键值对:

<table>
  <tbody>
    <!-- 循环每一行的分组 -->
    <tr *ngFor="let row of chunkedUiFields">
      <!-- 循环当前行内的键值对,每个占一个td -->
      <td *ngFor="let item of row">
        <label>{{item.key}}</label>
        <label>{{item.value}}</label>
      </td>
      <!-- 可选:最后一行不足4个时补空单元格,保证表格对齐 -->
      <td *ngIf="row.length < 4" [attr.colspan]="4 - row.length"></td>
    </tr>
  </tbody>
</table>

如果不想在TS层写处理逻辑,也可以用纯模板实现,但因为会重复调用keyvalue管道,性能稍差,仅作为备选:

<table>
  <tbody>
    <tr *ngFor="let _ of uiFields | keyvalue; let i = index">
      <ng-container *ngIf="i % 4 === 0">
        <td *ngFor="let offset of [0,1,2,3]" *ngIf="i + offset < (uiFields | keyvalue).length">
          <label>{{(uiFields | keyvalue)[i + offset].key}}</label>
          <label>{{(uiFields | keyvalue)[i + offset].value}}</label>
        </td>
      </ng-container>
    </tr>
  </tbody>
</table>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:06:05