antd Table 动态数据 合并单元格(合并行)

antd Table 组件动态合并单元格

最近处理table的时候 遇到了要合并同一列的几行的情况,比如第一列的前面三行都是同一个对象的名字,此时合并显示比较妥当,但是数据是后端接口来的,而且可以筛选条件,搜索出来的数据就是动态的长度,可能这次需要合并前面的五行, 在原有的静态数据的合并的基础上,需要加上一个合并的逻辑代码

下面的内容使用 "antd": "^5.7.0", 其他可能方法名略有不同

下面分两步讲解:

1、静态数据表格的行合并,讲解Table组件如何使用rowSpan进行合并

2、动态数据表格的行合并,通过在静态的处理之上加入解析逻辑来实现

本质是对数据源的处理,提前算好需要合并的数量存储到每一行的数据中去,渲染的时候直接通过合并属性赋值即可,这里只是讲解了行的合并,列的合并也是同样的思路

1、静态表格合并行

请添加图片描述

实现思路:处理columns中的rowSpan,遇到需要合并的行,设置rowSpan的数量为需要合并的行总数,然后把后面的rowSpan设置为0(不渲染该位置),否则这个表格就会乱套

下面就是我们合并了 ‘分类’ 列下面的 【1,2】行 ,【4,5,6】 行

import React, { useEffect, useState } from 'react'
import { Table} from 'antd'export default function Index() {const [ tableData, setTableData ] = useState<any>([])const columns = [{title: '分类',dataIndex: 'category',onCell: (row, index) => {// 合并 【1,2】行if (index === 0) {return { rowSpan: 2 }}if (index === 1) {return { rowSpan: 0 }}// 合并【4,5,6】 行if (index === 3) {return { rowSpan: 3 }}if (index === 4) {return { rowSpan: 0 }}if (index === 5) {return { rowSpan: 0 }}}},{title: '名称',dataIndex: 'name',},{title: '评价',dataIndex: 'desc',},];useEffect(() => {// 模拟生命周期接口获取数据let data = [{"category":"水果","name": "桃",  "desc": "桃子好吃"},{"category":"水果","name": "梨",  "desc": "梨子真好吃"},{"category":"蔬菜","name": "茄子",  "desc": "茄子茄子"},{"category":"家禽","name": "牛肉",  "desc": "吃不起"},{"category":"家禽","name": "羊肉",  "desc": "羊肉好羊肉"},{"category":"家禽","name": "猪肉",  "desc": "good"}]setTableData(data)}, [])return (<TableborderedrowKey="name"columns={columns}dataSource={tableData}pagination={false}/>)
}

1、静态表格合并行

根本的原理:处理数据源,合并行列的操作的数量都会在数据源中,提前算好渲染的rowSpan到每一行中就可以

主要看 handleData 函数,作一次循环找到重复类型的第一个row, 并向后一个比较,直到遍历完毕数组:

  1. 设置 startItem 记录开始计数的对象,并默认rowSpan = 1(自己就是1个)

  2. 取下一项进行比较,当 dataIndex (这里是类名) 相同则记录 startItem.rowSpan + 1 , 否则说明已经没有更多dataIndex重复的项了,设置新的startItem为下一项重复以上步骤,直到遍历结束

import React, { useEffect, useState } from 'react'
import { Table} from 'antd'export default function Index() {const [ tableData, setTableData ] = useState<any>([])const columns = [{title: '分类',dataIndex: 'category',onCell: (row:any) => ({ rowSpan: row.rowSpan || 0 })},{title: '名称',dataIndex: 'name',},{title: '评价',dataIndex: 'desc',},];useEffect(() => {// 模拟生命周期接口获取数据、处理数据let data = [{"category":"水果","name": "桃",  "desc": "桃子好吃"},{"category":"水果","name": "梨",  "desc": "梨子真好吃"},{"category":"蔬菜","name": "茄子",  "desc": "茄子茄子"},{"category":"家禽","name": "牛肉",  "desc": "吃不起"},{"category":"家禽","name": "羊肉",  "desc": "羊肉好羊肉"},{"category":"家禽","name": "猪肉",  "desc": "good"}]let res = handleData(data, 'category')setTableData(res)}, [])// 处理数据rowSpan函数const handleData = (array, dataIndex) => {if(array.length === 0) returnlet arr = [...array]// 1、startItem(默认rowSpan = 1)记录开始计数的对象let startItem:any = arr[0]startItem.rowSpan = 1// 2、遍历数组,取下一项进行比较,当name相同则startItem的rowSpan+1, 否则设置新的startItem为下一项arr.forEach((item:any, index) => {let nextItem:any = arr[index+1] || {}if(item[key] === nextItem[key]){startItem.rowSpan++}else{startItem = nextItemstartItem.rowSpan = 1}})return arr}return (<TableborderedrowKey="name"columns={columns}dataSource={tableData}pagination={false}/>)
}

以上都是基础用法,可以给这个函数改写一下,适应更复杂的场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/231930.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux的ping命令、wget命令、curl命令

一、ping命令 通过ping命令&#xff0c;可以检查指定的网络服务器是否是可联通状态 形式&#xff1a;ping [-c num] ip或主机名 -c&#xff1a;检查的次数&#xff0c;不使用-c&#xff0c;将无限次数持续检查 ip或主机名&#xff1a;被检查的服务器的ip地址或主机名地址 …

Jenkins分布式实现: 构建弹性和可扩展的CI/CD环境!

Jenkins是一个流行的开源持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续交付&#xff08;Continuous Delivery&#xff0c;CD&#xff09;工具&#xff0c;它通过自动化构建、测试和部署过程&#xff0c;帮助开发团队更高效地交付软件。Jenkins的…

AtomicReference自旋加CAS保证对象引用原子性

AtomicReference类提供了对象引用的非阻塞原子性读写操作&#xff0c;并且提供了其他一些高级的用法&#xff0c;对象的引用其实是一个4字节的数字&#xff0c;代表着在JVM堆内存中的引用地址&#xff0c;对一个4字节数字的读取操作和写入操作本身就是原子性的 package Atomic…

数据结构入门到入土——ArrayList与顺序表

目录 一&#xff0c;线性表 二&#xff0c;顺序表 1.接口实现 三&#xff0c;ArrayList简介 四&#xff0c;ArrayList使用 1.ArrayList的构造 2.ArrayList常见操作 3.ArrayList的遍历 4.ArrayList的扩容机制 五&#xff0c;ArrayLisit的具体使用 杨辉三角 一&#x…

【SpringMVC】常用注解

什么是MVC&#xff1f; MVC是一种程序分层开发模式&#xff0c;分别是Model&#xff08;模型&#xff09;&#xff0c;View&#xff08;视图&#xff09;以及Controller&#xff08;控制器&#xff09;。这样做可以将程序的用户界面和业务逻辑分离&#xff0c;使得代码具有良好…

虚拟机快照

1.为什么使用快照 在学习阶段我们无法避免的可能损坏Linux操作系统。 如果损坏的话&#xff0c;重新安装一个Linux操作系统就会十分麻烦。 VMware虚拟机&#xff08;Workstation和Funsion&#xff09;支持为虚拟机制作快照。 通过快照将当前虚拟机的状态保存下来&#xff0c;在…

CentOS 7.6下的HTTP隧道代理配置详解

在CentOS 7.6操作系统中&#xff0c;配置HTTP隧道代理需要一定的技术知识和经验。下面我们将详细介绍如何配置HTTP隧道代理&#xff0c;以确保网络通信的安全性和稳定性。 首先&#xff0c;我们需要了解HTTP隧道代理的基本原理。HTTP隧道代理是一种通过HTTP协议传输其他协议数…

SSM农产品朔源管理系统----计算机毕业设计

项目介绍 本项目分为前后台&#xff0c;分为普通用户、管理员、企业用户三种角色&#xff1b; 普通用户无需登录&#xff0c;可在前台直接进行溯源查询&#xff0c;管理员、企业用户可登录后台进行管理&#xff1b; 超级管理员角色包含以下功能&#xff1a; 登录,管理企业,设…

用友U8 Cloud smartweb2.RPC.d XXE漏洞复现

0x01 产品简介 用友U8 Cloud 提供企业级云ERP整体解决方案,全面支持多组织业务协同,实现企业互联网资源连接。 U8 Cloud 亦是亚太地区成长型企业最广泛采用的云解决方案。 0x02 漏洞概述 用友U8 Cloud smartweb2.RPC.d接口处存在 XXE漏洞,攻击者可通过该漏洞获取敏感文件…

云卷云舒:【实战篇】Redis迁移

1. 简介 Remote Dictionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统&#xff0c;是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 2. 迁移原理 redis-sh…

性能优化-OpenMP基础教程(三)

本文主要介绍OpenMP并行编程的环境变量和实战、主要对比理解嵌套并行的效果。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &…

麒麟镜像下载

试用版下载链接 产品试用申请国产操作系统、银河麒麟、中标麒麟、开放麒麟、星光麒麟——麒麟软件官方网站 下载自己对应的操作系统 我下载的是 共享文件下载 - Kylin Distro 然后用迅雷下载就可以了

基于sumo实现交通灯控制算法的模板

基于sumo实现交通灯控制算法的模板 目录 在windows安装run hello world networkroutesviewsettings & configurationsimulation 交通灯控制系统 介绍文件生成器类&#xff08;FileGenerator&#xff09;道路网络&#xff08;Network&#xff09;辅助函数生成道路网络&am…

SOFA Framework源代码及插件Win11编译开发环境配置

这篇文章主要记录详细的SOFA Framework软件的源代码编译环境配置过程&#xff0c;开发环境基于Win系统&#xff0c;编译完成后&#xff0c;可以在插件或框架的源代码上进行开发集成。本文纯手写输入&#xff0c;言简意赅&#xff0c;以大方向和思路为准&#xff0c;具体需要注意…

什么是Alibaba Cloud Linux?完全兼容CentOS,详细介绍

Alibaba Cloud Linux是基于龙蜥社区OpenAnolis龙蜥操作系统Anolis OS的阿里云发行版&#xff0c;针对阿里云服务器ECS做了大量深度优化&#xff0c;Alibaba Cloud Linux由阿里云官方免费提供长期支持和维护LTS&#xff0c;Alibaba Cloud Linux完全兼容CentOS/RHEL生态和操作方式…

Ubuntu22.04系统安装软件、显卡驱动、cuda、cudnn、pytorch

Ubuntu22.04系统安装软件、显卡驱动、cuda、cudnn、pytorch 安装 Nvidia 显卡驱动安装 CUDA安装 cuDNN安装 VSCode安装 Anaconda 并更换源在虚拟环境中安装 GPU 版本的 PyTorchReference 这篇博文主要介绍的是 Ubuntu22.04 系统中软件、显卡驱动、cuda、cudnn、pytorch 等软件和…

ubuntu 安装 anaconda

ubuntu 安装 anaconda 下载 wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh安装 bash Anaconda3-2023.09-0-Linux-x86_64.sh2.1 回车继续 2.2 许可协议 输入 q 退出阅读许可协议 2.3 输入 yes 接受 许可协议 2.4 设置 anaconda 安装位置 如不需…

轻松获取CHATGPT API:免费、无验证、带实例

免费获取和使用ChatGPT API的方法 快速开始&#xff1a;视频教程 章节一&#xff1a;GPT-API-Free开源项目介绍 GPT-API-Free 是一个开源项目&#xff0c;它提供了一个中转API KEY&#xff0c;使用户能够调用多个GPT模型&#xff0c;包括gpt-3.5-turbo、embedding和gpt-4。这…

C#中的值和引用笔记

文章目录 1. 简单介绍2. 如何判断值类型和引用类型3. 语句块4. 变量的生命周期5. 结构体中的值和引用6. 数组中的存储规则7. 结构体继承接口 1. 简单介绍 2. 如何判断值类型和引用类型 在代码中直接转到内部F12 如string类型 值类型int 3. 语句块 4. 变量的生命周期 5. 结构…

实现网页跟随系统主题切换

如何实现网页跟随系统主题切换&#xff1f;想必大家都是用过媒体查询media (prefers-color-scheme: dark) 实现亮/暗主题的切换&#xff0c;那如何让其跟随系统自动切换呢&#xff1f;在window对象上&#xff0c;有matchMedia这个API可以帮助我们解决这个问题。它和css中的媒体…