分组表格antd+ react +ts

js 复制代码
import React from "react";
import { Table, Tag } from "antd";
import styles from "./index.less";
import GroupTag from "../Tag";
const GroupTable = () => {
  const columns = [
    {
      title: "姓名",
      dataIndex: "name",
      key: "name",
      render: (text, record) => customRowRender(record, <a>{text}</a>),
      /* 合并单元格列 */
      onCell: (record) => {
        if (record.isGroupTag) {
          return {
            colSpan: 5,
          };
        }
      },
    },
    {
      title: "性别",
      dataIndex: "gender",
      key: "gender",
      render: (text) => text && (text === 0 ? "男" : "女"),
      /* 合并单元格列 */
      onCell: (record) => {
        if (record.isGroupTag) {
          return {
            colSpan: 0,
          };
        }
      },
    },
    {
      title: "年龄",
      dataIndex: "age",
      key: "age",
      /* 合并单元格列 */
      onCell: (record) => {
        if (record.isGroupTag) {
          return {
            colSpan: 0,
          };
        }
      },
    },
    {
      title: "地址",
      dataIndex: "address",
      key: "address",
      /* 合并单元格列 */
      onCell: (record) => {
        if (record.isGroupTag) {
          return {
            colSpan: 0,
          };
        }
      },
    },

    {
      title: "出生日期",
      key: "birthday",
      dataIndex: "birthday",
      /* 合并单元格列 */
      onCell: (record) => {
        if (record.isGroupTag) {
          return {
            colSpan: 0,
          };
        }
      },
    },
  ];

  const data = [
    {
      key: "1",
      title: "家人",
      tagColor: "rgba(10, 196, 72, 1)",
      data: [
        {
          key: "1",
          name: "张三",
          gender: 0,
          age: 32,
          address: "浙江省杭州市余杭区五常街道幸福小区3幢1单元202室",
          birthday: "1991-03-04",
        },
        {
          key: "2",
          name: "李四",
          gender: 1,
          age: 19,
          address: "浙江省杭州市余杭区五常街道幸福小区5幢2单元301室",
          birthday: "2004-01-26",
        },
        {
          key: "3",
          name: "王五",
          gender: 0,
          age: 26,
          address: "浙江省杭州市余杭区五常街道幸福小区7幢3单元503室",
          birthday: "1997-10-17",
        },
      ],
    },
    {
      key: "2",
      title: "朋友",
      tagColor: "rgba(34, 139, 34, 1)",
      data: [
        {
          key: "4",
          name: "张三",
          gender: 0,
          age: 32,
          address: "浙江省杭州市余杭区五常街道幸福小区3幢1单元202室",
          birthday: "1991-03-04",
        },
        {
          key: "5",
          name: "李四",
          gender: 1,
          age: 19,
          address: "浙江省杭州市余杭区五常街道幸福小区5幢2单元301室",
          birthday: "2004-01-26",
        },
        {
          key: "6",
          name: "王五",
          gender: 0,
          age: 26,
          address: "浙江省杭州市余杭区五常街道幸福小区7幢3单元503室",
          birthday: "1997-10-17",
        },
      ],
    },
    {
      key: "3",
      title: "同事",
      tagColor: "rgba(255, 173, 10, 1)",
      data: [
        {
          key: "7",
          name: "张三",
          gender: 0,
          age: 32,
          address: "浙江省杭州市余杭区五常街道幸福小区3幢1单元202室",
          birthday: "1991-03-04",
        },
        {
          key: "8",
          name: "李四",
          gender: 1,
          age: 19,
          address: "浙江省杭州市余杭区五常街道幸福小区5幢2单元301室",
          birthday: "2004-01-26",
        },
        {
          key: "9",
          name: "王五",
          gender: 0,
          age: 26,
          address: "浙江省杭州市余杭区五常街道幸福小区7幢3单元503室",
          birthday: "1997-10-17",
        },
      ],
    },
  ] as any;

  const tableData = data.flatMap((group) => [
    {
      key: `${group.key}-tag`,
      groupTag: group.title,
      tagColor: group.tagColor,
      isGroupTag: true,
    },
    ...group.data.map((item) => ({ ...item, group })),
  ]);

  const customRowRender = (record, children) => {
    console.log(record, "???");
    if (record.isGroupTag) {
      return {
        children: (
          <td colSpan={columns.length}>
            <GroupTag color={record.tagColor} text={record.groupTag} />
            {/* <Tag color={record.tagColor}>{record.groupTag}</Tag> */}
          </td>
        ),
        props: {
          colSpan: columns.length,
        },
      };
    }
    return children;
  };

  return (
    <div>
      <Table
        columns={columns}
        dataSource={tableData}
        pagination={false}
        rowKey={(record) => record.key}
        rowClassName={(record) => (record.isGroupTag ? styles.groupTagRow : "")}
      />
    </div>
  );
};

export default GroupTable;
css 复制代码
.groupTagRow {
    :global {
        td.ant-table-cell {
            padding:12px 0px 0px 0px  !important;
            border: unset !important;
        }
    }
}

效果

相关推荐
刘发财4 小时前
弃用html2pdf.js,这个html转pdf方案能力是它的几十倍
前端·javascript·github
牛奶7 小时前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶7 小时前
前端人为什么要学AI?
前端·人工智能·ai编程
Kagol9 小时前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
GIS之路10 小时前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide10 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
ssshooter11 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
格砸11 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
Live0000012 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉12 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化