当前位置: 首页 > news >正文

ant-design表格自动合并相同内容的单元格

表格自动合并相同内容的单元格

合并hooks

import { TableColumnProps } from 'antd'export const useAutoMergeTableCell = <T extends object>(dataSource: Array<T>,columns: Array<TableColumnProps> | Array<keyof T>
): Map<keyof T, Array<number>> => {const cellToIndexMap = new Map<keyof T, Array<number>>()const countInfoMap = new Map<keyof T, { startIndex: number; count: number; value: any } | null>()const length = dataSource.lengthconst parseColumns = columns.map((m) => {if (typeof m === 'string') {return {dataIndex: m}}return m})parseColumns.forEach((it) => {cellToIndexMap.set(it.dataIndex as keyof T, new Array(length).fill(0))countInfoMap.set(it.dataIndex as keyof T, null)})const updateCellCount = (key: string) => {const countInfo = countInfoMap.get(key as keyof T)const indexArray = cellToIndexMap.get(key as keyof T)indexArray![countInfo!.startIndex] = countInfo!.count}const calculateCount = (key: string, value: any, index: number) => {const countInfo = countInfoMap.get(key as keyof T)if (countInfo === null) {countInfoMap.set(key as keyof T, { startIndex: index, count: 1, value })} else {if (countInfo!.value === value) {countInfo!.count++} else {updateCellCount(key)countInfoMap.set(key as keyof T, { startIndex: index, count: 1, value })}}if (index === length - 1) {updateCellCount(key)}}for (let i = 0; i < length; ++i) {parseColumns.forEach((column) => {const key = column.dataIndex as stringcalculateCount(key, Reflect.get(dataSource[i], key), i)})}return cellToIndexMap
}

使用

让所有的列都进行单元格合并

// dataSource 用自己表格的数据
// columns 为你定义的列
const cellToIndexMap = useAutoMergeTableCell(dataSource, columns)
const parseColumns = columns.map((m) => {return {...m,onCell: (_, index) => {const indexArray = cellToIndexMap.get(m.dataIndex as keyof T)return {rowSpan: indexArray![index!] ?? 1}}} as TableColumnPropsreturn m
})

只想部分列进行合并

只需要传递对应的想要合并的 key 即可

const cellToIndexMap = useAutoMergeTableCell(dataSource, ['key1', 'key2'])
const parseColumns = columns.map((m) => {return {...m,onCell: (_, index) => {const indexArray = cellToIndexMap.get(m.dataIndex as keyof T)return {rowSpan: indexArray![index!] ?? 1}}} as TableColumnPropsreturn m
})

关于element-ui

如果想要适配于 element-ui,只需要把 hooks 中的 dataIndex 替换为 prop 即可。

使用:

const cellToIndexMap = useAutoMergeTableCell(dataSource, ['key1', 'key2'])
// or
// const cellToIndexMap = useAutoMergeTableCell(dataSource, columns)
spanMethods ({ row, column, rowIndex, columnIndex }) {const indexArray = cellToIndexMap.get(column.prop)return {rowSpan: indexArray![index!] ?? 1colspan: 1}
}

http://www.mrgr.cn/news/29639.html

相关文章:

  • Git学习教程(更新中)
  • 在ubuntu上安装ubuntu22.04并ros2 humble版本的docker容器记录
  • 代码修改材质参数
  • kafka 生产经验——数据积压(消费者如何提高吞吐量)
  • 从0学习React(11)
  • 数字后端教程之Innovus report_property和get_property使用方法及应用案例
  • 基于windows下docker安装HDDM并运行
  • Linux权限理解【Shell的理解】【linux权限的概念、管理、切换】【粘滞位理解】
  • MODIS/Landsat/Sentinel下载教程详解【常用网站及方法枚举】
  • 【Manim】用manim描述二次曲面——上
  • 构建自己的文生图工具:Python + Stable Diffusion + CUDA
  • 为什么制造业要上MES,有哪些不得不上的理由吗?
  • AntFlow系列教程二之流程同意
  • 系统架构设计师 数据库篇
  • ARM架构中的重要知识点的详细解释
  • python中Web API 框架
  • 力扣之181.超过经理收入的员工
  • 多线程2(gamere)
  • Python 课程16-Pygame
  • spring security 手机号 短信验证码认证、验证码认证 替换默认的用户名密码认证132
  • itk c++ 3D医学图像刚性配准
  • 【与C++的邂逅】--- C++的IO流
  • wifi中的相干带宽
  • Windows系统下使用VS排查内存泄露的两种办法
  • 如何在 Qt 的 QListWidget 中逐行添加和显示数据
  • eNSP简单用法