如何使用ElementUI的table组件来实现单元格的行合并

news2025/1/11 3:26:49

前言

最近在编写一个值班的排班表,然后中间涉及到了表格应用。并且还要做出类似这种效果的行合并效果:
原型
然后就开始找组件了。Html的table是有rowsSpancolsSpan的属性来实现行合并和列合并的。然后就在网上找资料,发现没有几篇能把这两个属性将好的,并且大多数讲的都是列合并,没有行合并。我自己用的是Vutify组件进行页面绘制,但是Vutify的table组件没有合并的api。要实现的话,就得重写body的插槽,也就等于手写table。而且,重写也只能合并列,行的合并还是没法实现。然后Vutify其实是继承ElementUI实现的,然后又看了一下ElementUI的el-table,才发现了较好的解决方式。

ElementUI实现

官方主要是在el-table上加入一个objectSpanMethod来实现的
在这里插入图片描述
objectSpanMethod的具体实现:

objectSpanMethod({ row, column, rowIndex, columnIndex }) {
        if (columnIndex === 0) {
          if (rowIndex % 2 === 0) {
            return {
              rowspan: 2,
              colspan: 1
            };
          } else {
            return {
              rowspan: 0,
              colspan: 0
            };
          }
        }
      }

tableData的数据模型:

tableData: [{
          id: '12987122',
          name: '王小虎',
          amount1: '234',
          amount2: '3.2',
          amount3: 10
        }, {
          id: '12987123',
          name: '王小虎',
          amount1: '165',
          amount2: '4.43',
          amount3: 12
        }, {
          id: '12987124',
          name: '王小虎',
          amount1: '324',
          amount2: '1.9',
          amount3: 9
        }, {
          id: '12987125',
          name: '王小虎',
          amount1: '621',
          amount2: '2.2',
          amount3: 17
        }, {
          id: '12987126',
          name: '王小虎',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }]
      }

然后效果图:
在这里插入图片描述
但看这个效果,其实还不错,但其实有一些问题:

  • 数据模型中的ID不是连续的,合并行的时候取得是该组的第一个元素的ID
  • 数据模型只能是两两配对,中途不能出现其他配对的组合,否则,数据会错乱。由于,例子中的数据长度只有5条,最后一条没有合并的选项,因此看不出问题

实际应用中,后端返回的不会只是固定的两两或者三三或者固定行合并的数据。中途可能穿插四四或者五五的都有。单靠例子的实现是行不通的。好在本人研究了十分钟后,想到了解决办法。

解决非固定行合并

解决的关键在于读懂objectSpanMethod这个方法,我们再回顾一下官方的实现模式:

objectSpanMethod({ row, column, rowIndex, columnIndex }) {
        if (columnIndex === 0) { // 表示只操作第一列
          if (rowIndex % 2 === 0) { // 表示只对奇数行进行操作(注意Index从0开始,因此不是偶数行)
            return {
              rowspan: 2, //需要合并的行数
              colspan: 1 // 合并后的列数
            };
          } else {
            return {
              rowspan: 0, // 0消掉这一行
              colspan: 0 // 0消掉这一列 二者合并起来就是消掉这一个单元格子
            };
          }
        }
      }

注意,这里的row打印值得话,实际就是每个数据条目本身
我将代码注释了一下,但是一般人估计还是看不懂,那我再上一张图:
在这里插入图片描述
蓝色的数据行是要合并的一组,这里是2行。黄色行是该组合并的基底行格子(奇数行),黑色行是消掉的没有绘制的格子。合并过后,黄色的格子就填满了蓝色格子区间,实现了合并。最后一行因为没有待合并的行,所以就是它自己。

读懂这个例子后,我们应该清楚要合并的话,需要知道:

  • 基底行格子所在的行的索引值
  • 从基底行开始,向下要合并的行的数量

官方实例中,这两条恰好都是写死的固定值,但是我们实际应用中,可能就不是了。
我在写这个查询表的时候,后端给我的数据长这个样子,一个2-3-2组合:

data=[
	{
		day:'2023-01-01',
		workers:[
			{
				name:'小明',
				mobile:'1334455667788'
			},
			{
				name:'小黄',
				mobile:'1334455667788'
			}
		]
	},
	{
		day:'2023-01-02',
		workers:[
			{
				name:'小郑',
				mobile:'1334455667788'
			},
			{
				name:'小朱',
				mobile:'1334455667788'
			},
			{
				name:'小刘',
				mobile:'1334455667788'
			}
		]
	},
	{
		day:'2023-01-03',
		workers:[
			{
				name:'小罗',
				mobile:'1334455667788'
			},
			{
				name:'小李',
				mobile:'1334455667788'
			}
		]
	}
]

看过官方的例子后,其实应该把数据转换为:

[
	{
		day:'2022-01-01',
		name:'小明',
		mobile:'1334455667788'
	},
	{
		day:'2022-01-01',
		name:'小黄',
		mobile:'1334455667788'
	},
	{
		day:'2022-01-02',
		name:'小郑',
		mobile:'1334455667788'
	},
	{
		day:'2022-01-02',
		name:'小朱',
		mobile:'1334455667788'
	},
	{
		day:'2022-01-02',
		name:'小刘',
		mobile:'1334455667788'
	},
	{
		day:'2022-01-03',
		name:'小罗',
		mobile:'1334455667788'
	},
	{
		day:'2022-01-03',
		name:'小李',
		mobile:'1334455667788'
	}
]

我在操作数据转换的时候,增加了isFirstsameIndex属性:

const dataList=[] // 最终转换好的数据集合
data.forEach(({ day, workers = [] }) => {
          if (Array.isArray(workers) && workers.length > 0) {
            workers.forEach(({ name, mobile }, index) => {
              dataList.push({
                date: day,
                name,
                mobile,
                isFirst: index === 0, // 合并行的时候用于标记起始合并的位置
                sameIndex: workers.length // 需要合并的行数
              })
            })
          } else {
          	// 如果没有返回worker就手动加个占位用
            dataList.push({
              date: day,
              name: '--',
              mobile: '',
              isFirst: true,
              sameIndex: 1
            })
          }
        })

然后重写objectSpanMethod方法:

objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        if (row.isFirst === true) {
          return {
            rowspan: row.sameIndex,
            colspan: 1
          }
        } else {
          return {
            rowspan: 0,
            colspan: 0
          }
        }
      }
    }

由于row就是我们每行实际的数据,isFirst实际就是定位基底行的位置,sameIndex就是从该行开始一共要合并的行的数量,这样我们就比较巧妙地实现了行合并效果,而且是动态自动合并行数地。
最后看一下成品效果图:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题模版:111 - 120

目录 简介111. 二叉树的最小深度112. 路径总和113. 路径总和 II114. 二叉树展开为链表115. 不同的子序列116. 填充每个节点的下一个右侧节点指针117. 填充每个节点的下一个右侧节点指针 II118. 杨辉三角119. 杨辉三角 II120. 三角形最小路径和结语简介 Hello! 非常感谢您阅读海…

SWPUCTF 2022新生赛 web部分wp

😋大家好,我是YAy_17,是一枚爱好网安的小白。 本人水平有限,欢迎各位大佬指点,一起学习💗,一起进步⭐️。⭐️此后如竟没有炬火,我便是唯一的光。⭐️ 目录 [SWPUCTF 2022 新生赛]…

linux中使用KubeSphere和集群k8s 部署springboot项目

上期已经介绍了单体k8s部署springboot项目,这期讲解集群k8s部署springboot项目 因为部署方式已经在单体中讲过,现在大体粗略讲一下首先看下集群节点,如下所示: 第一步:创建项目----》按照做的项目名称建 创建后&…

MyCat实现单库分表+代理所有表

MyCAT支持水平分片与垂直分片: 水平分片:一个表格的数据分割到多个节点上,按照行分隔。 垂直分片:一个数据库中多个表格A,B,C,A存储到节点1上,B存储到节点2上,C存储到…

Unity 过场工具(Cutscene)设计(二)

Unity 过场工具(Cutscene)设计(二) 本章主要分析一下过场一般的必要组成元素,以及在Unity中的制作方案 镜头 通常来说一个表现要求比较高的过场,需要专业的导演进行运镜操作的。 在Unity中官方有一个很好的镜头插件 Cinemachine…

基于Leaflet的VideoOverlay视频图层叠加实战

前言在基于二维的场景中,也许会遇到以下的需求。在某交通路口或者重要的监控点,需要将实时或者录制的视频信息叠加在地图上。更有甚者,随着设备通讯方式的增强,无人机等设备可以采集实时数据,实时回传到控制终端&#…

纵有疾风起,Petterp与他的2022

引言 每逢年末,都要来聊一聊关于今年的各种事情,今昔也不例外:) 与往年不同的是,今天刚搬完家,现在是晚上 1:44 ,正是忙碌一天后比较头痛的时刻。 此刻写点东西,脑子也许会放松一下。🤖 坐在桌子前&…

RFID技术应用在服装门店管理

服装行业是一个高度一体化的行业,集设计研发、成衣生产、运输、销售于一体。在这些过程中,传统的服装供应链往往消耗巨大的人力、物力和资金成本,但效果一般。当今市场消费者的需求变幻莫测,时尚潮流日新月异。稍有延误&#xff0…

从零编写MDK的FLM烧录算法

文章目录前言一、将代码中的图片资源下载到外部flash1. 修改分散加载文件2. 添加外部flash算法二、制作FLM文件步骤三、使用STM32CubeMX新建工程前言 上文讲过,当我们要下载编译好的镜像到Flash时,首先要做的一步就是选择合适的Flash下载算法&#xff0…

WPS Office 2019 版本 excel透视图创建及删除

摘要:记录一下在做2022年总结数据时遇到的问题,主要问题有2个,①从飞书多维表格导下来数据后不能求和计算和下拉序号,②excel数据透视表创建及删除。 相关文章: 一、Excel WPS Office 2019 版本 excel透视图创建及删…

合作升级|Kyligence 跬智智能分析平台入选华为云联营商品

近日,Kyligence 跬智智能分析平台正式入选华为云联营商品,成为华为云在数据分析领域的联营合作伙伴。通过联营模式,双方将加深在产品、解决方案等多个领域的合作,携手打造“共生、共创、共营、共赢”的合作生态,为用户…

[激光原理与应用-65]:激光器-器件 - 多模光纤(宽频光纤)、单模光纤的原理与区别

第1章 光纤基础与概述1.1 概述光纤是光导纤维的简写,是一种由玻璃或塑料制成的纤维,可作为光传导工具。传输原理是“光的全反射”。微细的光纤封装在塑料护套中,使得它能够弯曲而不至于断裂。通常,光纤的一端的发射装置使用发光二…

Spring Boot(五十三):SpringBoot Actuator之简单实现

1 场景介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统,在线上时通常会遇到下面一些问题,比如: 1. 如何知道哪些服务除了问题,如何快速定位? (健康状况) 2. 如何统一监控各个微服务的性能指标…

不确定性量化 (UQ) 可以显著提高预测准确性,在不确定的世界中获得最佳结果昆士兰大学Mike McKerns-中国学者网

在不确定的世界中获得最佳结果,不确定性量化可以解开成功与失败之间的区别。不确定性量化 (UQ) 可以显著提高预测准确性,提供设计优化,并在充满未知的世界中促进快速解决方案改进。昆士兰大学的一个机构"不确定性量化基金会&…

vue3中常用的指令之v-bind和v-on

一、v-bind指令 一个vue2和vue3之间的不同之处:Vue2中template模板中只能有一个根元素,但是在Vue3中允许template中有多个元素。 1.v-bind的绑定基本属性 某些属性也希望是动态绑定的,比如动态绑定a元素中的href属性。 v-bind可以绑定一个…

verilog学习笔记- 14)静态数码管显示实验

目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证: 简介: 数码管也称半导体数码管,它是将若干发光二极管按一定图形排列并封装在一起的一种数码显示器件。常见的数码管如图这种数码管主要被称为八段数码管或 8 字形数码管,可用来显示小数点、数…

【Linux 基础】

【Linux 基础】 一、 Linux 概述 1. Linux 介绍 UNIX 是一个强大的多用户、多任务操作系统,于1969年在贝尔实验室开发,UNIX 的商标权有国际开放组织(The Open Group)所拥有,UNIX 操作系统是商业版,需要收…

【OpenGL学习】Shader和Shader类的抽象

Shader 本节学习OpenGL中Shader的使用并将其抽象为类,简要介绍OpenGL所使用的着色器语言GLSL。 一、什么是Shader? 参考维基百科中对Shader的定义:着色器 - 维基百科,自由的百科全书 (wikipedia.org) 计算机图形学领域中&…

SpringBoot处理跨域总结

解决跨域的五种方法1、CorsFilter新建一个类Configuration public class CorsConfig {Beanpublic CorsFilter corsFilter() {//1. 添加 CORS配置信息CorsConfiguration config new CorsConfiguration();//放行哪些原始域//springboot版本为2.4.0以前写法config.addAllowedOrig…

kaggle竞赛 | Instant Gratification

kaggle比赛链接: https://www.kaggle.com/competitions/instant-gratification/data 目录普通方案优胜方案1. 用方差筛选特征2.QDA二次判别分析3.数据分组(伪标签)4.查看结果赛题总结普通方案 # 数据集路径 INPUT_PATH ../input/import num…