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

效果

相关推荐
黄智勇5 分钟前
xlsx-handlebars 一个用于处理 XLSX 文件 Handlebars 模板的 Rust 库,支持多平台使
前端
brzhang1 小时前
为什么 OpenAI 不让 LLM 生成 UI?深度解析 OpenAI Apps SDK 背后的新一代交互范式
前端·后端·架构
brzhang2 小时前
OpenAI Apps SDK ,一个好的 App,不是让用户知道它该怎么用,而是让用户自然地知道自己在做什么。
前端·后端·架构
爱看书的小沐2 小时前
【小沐学WebGIS】基于Three.JS绘制飞行轨迹Flight Tracker(Three.JS/ vue / react / WebGL)
javascript·vue·webgl·three.js·航班·航迹·飞行轨迹
水冗水孚2 小时前
React中使用map+area标签实现img图片特定区域标记功能(可用Photoshop精准拾取对应点位)
react.js·html·photoshop
井柏然2 小时前
前端工程化—实战npm包深入理解 external 及实例唯一性
前端·javascript·前端工程化
IT_陈寒3 小时前
Redis 高性能缓存设计:7个核心优化策略让你的QPS提升300%
前端·人工智能·后端
aklry3 小时前
elpis之动态组件机制
javascript·vue.js·架构
井柏然3 小时前
从 npm 包实战深入理解 external 及实例唯一性
前端·javascript·前端工程化
羊锦磊4 小时前
[ vue 前端框架 ] 基本用法和vue.cli脚手架搭建
前端·vue.js·前端框架