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 (
    <Table
      bordered
      rowKey="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) return
    let 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 = nextItem
        startItem.rowSpan = 1
      }
    })
    return arr
  }

  return (
    <Table
      bordered
      rowKey="name"
      columns={columns}
      dataSource={tableData}
      pagination={false}
    />
  )
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标检测 | YOLOv5 训练自标注数据集实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要了解 YOLOv5 训练自标注数据集&#xff08;自行车和摩托车两种图像&#xff09;进行目标检测&#xff0c;实现迁移学习。YOLOv5 是一个非常流行的图像识别框架&#xff0c;这里介绍一下使用 YOLOv5 给使用 Labelme 标注…

AI模型部署落地综述(ONNX/NCNN/TensorRT等)

导读 费尽心血训练好的深度学习模型如何给别人展示&#xff1f;只在服务器上运行demo怎么吸引别人的目光&#xff1f;怎么才能让自己的成果落地&#xff1f;这篇文章带你进入模型部署的大门。 0 前言 模型部署的步骤&#xff1a; 训练一个深度学习模型&#xff1b; 使用不同…

NNDL总结

第四章 前馈神经网络 4.1 神经元 人工神经元&#xff0c;简称神经元&#xff0c;是构成神经网络的基本单元。 当>0时&#xff0c;为1&#xff0c;兴奋&#xff1b; 当<0时&#xff0c;为0&#xff0c;抑制。 激活函数的性质 1、连续可导的非线性函数。 2、激活函数及其导…

C语言 B树的分析与实现

本文主要说明了B树的概念、应用以及如何用C语言实现B树。 概述 有使用过数据库的朋友都知道&#xff0c;数据库需要存储大量的数据&#xff0c;并且查询数据的性能也需要一定的保证。那么数据库的底层数据结构是如何实现的呢&#xff0c;就是我们要讨论的B树和B树&#xff0c…

【电源专题】电池充放电中常说的0.2C是什么概念

在工作中我们时常会听到老员工说拿这个电池去做一下充放电,以0.2C充,0.2C放。那么这个0.2C到底是啥? 这就要说到电池C-rate概念。在《GB 31241:便携式电子产品用锂离子电池和电池安全要求》中我们可以看到3.7中写了额定容量为C,也就是制造商标明的电池或电池组容量。 那么…

src refspec master does not match any

新项目推送至 Git 空仓库时抛出如下异常 src refspec master does not match any 初始化 init 都做了但反复尝试 git push -u origin master 均无果 后发现权限不够 .... 起初设置为开发者,后变更为了主程序员再次尝试 push 成功 .... 以上便是此次分享的全部内容&#xff0c;…

MyBatisPlus学习二:常用注解、条件构造器、自定义sql

常用注解 基本约定 MybatisPlus通过扫描实体类&#xff0c;并基于反射获取实体类信息作为数据库表信息。可以理解为在继承BaseMapper 要指定对应的泛型 public interface UserMapper extends BaseMapper<User> 实体类中&#xff0c;类名驼峰转下划线作为表名、名为id的…

etcd储存安装

目录 etcd介绍: etcd工作原理 选举 复制日志 安全性 etcd工作场景 服务发现 etcd基本术语 etcd安装(centos) 设置&#xff1a;etcd后台运行 etcd 是云原生架构中重要的基础组件&#xff0c;由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册…

单片机大小端模式

单片机大小端模式 参考链接 单片机干货-什么是大小端_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Ju4y1M7Tx/?spm_id_from333.337.search-card.all.click&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e 特此记录 anlog 2024年1月2日

C语言——内存函数【memcpy,memmove,memset,memcmp】

&#x1f4dd;前言&#xff1a; 在之前的文章C语言——字符函数和字符串函数&#xff08;一&#xff09;中我们学习过strcpy和strcat等用来实现字符串赋值和追加的函数&#xff0c;那么除了字符内容&#xff0c;其他的数据&#xff08;例如整型&#xff09;能否被复制或者移动呢…

IDEA2023 最新版详细图文安装教程(Java环境搭建+IDEA安装+运行测试+汉化+背景图设置)

IDEA2023 最新版详细图文安装教程 名人说&#xff1a;工欲善其事&#xff0c;必先利其器。——《论语》 作者&#xff1a;Code_流苏(CSDN) o(‐&#xff3e;▽&#xff3e;‐)o很高兴你打开了这篇博客&#xff0c;跟着教程去一步步尝试安装吧。 目录 IDEA2023 最新版详细图文安…

Linux第15步_安装FTP客户端

安装完FTP服务器后&#xff0c;还需要安装FTP客户端&#xff0c;才可以实现Ubuntu系统和Windows系统进行文件互传。 1、在STM32MP157开发板A盘基础资料\03软件中&#xff0c;找到“FileZilla_3.51.0_win64-setup.exe”&#xff0c;双击它&#xff0c;就可以安装。 2、点击“I …

吉他打谱软件Guitar Pro8苹果Mac电脑简体中文特别版

Guitar Pro 8 Mac是一款吉他编曲学习软件&#xff0c;用于吉他、贝和其他弦乐器的制谱和演奏&#xff0c;这是一个多轨编辑器&#xff0c;具有集成的 MIDI 编辑器、合唱绘图仪、吉他、节拍器和其他音乐家工具。它使您能够编辑吉他、贝司和尤克里里、乐谱、指法谱&#xff0c;并…

浅谈云可观测性的关键组件及重要性

在云计算时代&#xff0c;企业和开发团队不仅需要关注应用程序的功能性&#xff0c;还需要关心系统在生产环境中的性能、可用性和可靠性。云可观测性成为一项关键的技术实践&#xff0c;它涵盖了日志、指标、追踪等多个方面&#xff0c;为系统监控和故障诊断提供了全方位的支持…

二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明

处理二手买卖、废品回收小程序 在app.json中声明permission scope.userLocation字段 教程说明 sitemapLocation 指明 sitemap.json 的位置&#xff1b;默认为 ‘sitemap.json’ 即在 app.json 同级目录下名字的 sitemap.json 文件 找到app.json这个文件 把这段代码加进去&…

分解质因数算法总结

知识概览 n中最多只包含一个大于的质因子。 例题展示 题目链接 活动 - AcWing 系统讲解常用算法与数据结构&#xff0c;给出相应代码模板&#xff0c;并会布置、讲解相应的基础算法题目。https://www.acwing.com/problem/content/869/ 题解 分解质因数可以用试除法解决&…

Zoho SalesIQ:构建客户服务知识库的实用工具与指南

客服人员每天都有很多事情要做&#xff0c;包括在线聊天、音频通话、屏幕共享和发送电子邮件。为什么要将搜索常用信息添加到他们列表中呢&#xff1f;因为客户在遇到问题的同时想快速解决问题。所以&#xff0c;我们要使用Zoho SalesIQ客服系统构建客户服务知识库。 一、什么…

根据MySql的表名,自动生成实体类,模仿ORM框架

ORM框架可以根据数据库的表自动生成实体类&#xff0c;以及相应CRUD操作 本文是一个自动生成实体类的工具&#xff0c;用于生成Mysql表对应的实体类。 新建Winform窗体应用程序AutoGenerateForm&#xff0c;框架(.net framework 4.5)&#xff0c; 添加对System.Configuration的…

【经验】VSCode连接远程服务器(可以使用git管理、方便查看和编辑Linux源码)

1、查看OpenSSH Windows10通常自带OpenSSH不需要安装。 Windows10下检查是否已经安装OpenSSH的方法: 1)按下快捷键Win + X,选择Windows PoweShell(管理员) 2)输入以下指令: Get-WindowsCapability -Online | ? Name -like ‘OpenSSH*’ 3)如果电脑未安装OpenSSH,…

RFID标签在汽车监管方面的应用与实施方案

RFID技术在汽车工业领域得到了广泛应用&#xff0c;主要体现在汽车资质证书远程监管系统的普及化&#xff0c;系统包括OBD接口监视器、车证监管箱、超高频读写设备、应用系统软件以及大数据采集与处理等组成部分。 在汽车物流监管方面&#xff0c;系统利用OBD接口监控车辆并实时…