分组表格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;
        }
    }
}

效果

相关推荐
To_OC7 小时前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC7 小时前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
天渺工作室8 小时前
实现一个adblock/adblock plus等浏览器广告拦截器检测插件
前端·javascript
阳光是sunny8 小时前
Vue 项目怎么做用户行为全链路监控?轻量插件方案详解
前端·面试·架构
ZhengEnCi9 小时前
Q04-Vite禁用CSS代码分割-解决生产环境样式加载顺序混乱问题
前端·vue.js·vite
九酒9 小时前
AI Agent 开发踩坑记:口播功能非得用 APP 原生实现吗?
前端·人工智能·agent
Jackson__10 小时前
做了一段时间的AI coding后,我终于搞清了 CLI 和 MCP 的区别
前端·agent·ai编程
IT_陈寒12 小时前
JavaScript项目实战经验分享
前端·人工智能·后端
用户479492835691513 小时前
6w star,GitHub 趋势第一的 Ponytail,这个agent插件到底在火什么
前端·后端
薛定喵的谔14 小时前
我开源了一个精致的 Next.js 博客模板:Skyplume
前端·前端框架·next.js