el-table 动态计算合并行

原始表格及代码

在这里插入图片描述

<el-table:data="tableData"class="myTable"header-row-class-name="tableHead"
><el-table-column prop="date" label="日期"> </el-table-column><el-table-column prop="name" label="姓名"> </el-table-column><el-table-column prop="project" label="项目"> </el-table-column><el-table-column prop="address" label="地址" min-width="200"></el-table-column>
</el-table>
// 模拟数据接口请求并排序
getDataMock() {for (var i = 0; i < 10; i++) {let randomDay = Math.floor(Math.random() * 5 + 1);this.tableData.push({date: "2024-12-" + randomDay,name: "王小虎" + i,project: "项目" + i,address: "上海市普陀区金沙江路 " + i + " 弄",});}this.tableData.sort((a, b) => {let time1 = new Date(a.date).getTime();let time2 = new Date(b.date).getTime();return time1 - time2;});
},
.myTable {width: 700px;margin: 0 auto;border-radius: 20px;.tableHead {.el-table__cell {background-color: #bee7c5;color: #264f30;border-bottom: none;&:first-child {background: #435f5b;color: #fff;}}}.el-table__body {.el-table__row {.el-table__cell {background: #f7f7f7;border-bottom: 1px solid #dcdcdc;&:first-child {background: #acb2d9;color: #32405b;font-weight: bold;border-bottom: 1px solid #32405b;}}}}
}

合并行

  • 需要动态计算表格数据的合并行数
  • 如图所示,需要得到如下的 rowspan
    在这里插入图片描述
  • 计算表格数据每行的 rowspan
// 动态计算合并行的索引
getTableDataSpan(arr) {let spanData = []; // 数据数组的 rowspan 集合// rowspan > 1,合并行// rowspan == 1,单独行,不参与合并// rowspan == 0,被合并的行let lastRowIndex = 0; // 记录索引arr.forEach((item, index) => {if (index == 0) {// 第一行,默认认为不参与合并,记录为 1spanData.push(1);} else {if (item.date == arr[index - 1].date) {// 当前行的 date 与上一行的 date 相同,即当前行 的 rowspan 需要被记为 0spanData.push(0);// 向前找上次记录的索引,即需要当前行合并过去的目标行,使目标行的 rowspan 值加一spanData[lastRowIndex] += 1;} else {// 当前行的 date 与上一行的 date 不相等,则当前行的 rowspan 记录为 1spanData.push(1);// 暂且记录一下 lastRowIndex// 如果下一行与当前行的 date 值相同,就会合并到当前行,否则会更新 lastRowIndex 的值,进行下次对比lastRowIndex = index;}}});return {spanData: spanData,lastRowIndex: lastRowIndex,};
},
  • 计算 span-method 属性
 <el-table:data="tableData"class="myTable"header-row-class-name="tableHead":span-method="spanMethod">...
spanMethod({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) {// 只有第一列需要合并,所以限定为 columnIndex === 0// 获取当前行的 rowspanlet rowspan = this.getTableDataSpan(this.tableData).spanData[rowIndex];let colspan = rowspan === 0 ? 0 : 1; // 被合并到其他行,需要为 colspan 赋值为 0,否则为 1return {rowspan: rowspan,colspan: colspan,};}
},

样式调整优化

  • 上述代码得到如下效果
  • 原因是被合并的行,删掉了首列,被赋予了 first-child 的样式

在这里插入图片描述

  • 调整样式,为首列元素动态赋予类名
<el-table:data="tableData"class="myTable"header-row-class-name="tableHead":span-method="spanMethod":cell-class-name="cellClassName"
>
...
cellClassName({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) {return "colorBox"; // 首列添加类名}
},
.el-table__body {
.el-table__row {.el-table__cell {background: #f7f7f7;border-bottom: 1px solid #dcdcdc;&.colorBox {background: #acb2d9;color: #32405b;font-weight: bold;border-bottom: 1px solid #32405b;}}}
}
  • 效果如图,会发现,动态赋予的 colorBox 类名,并没有被加到被合并的行的首列元素上
    在这里插入图片描述

完整代码段

<template><div class="tableBox"><el-table:data="tableData"class="myTable"header-row-class-name="tableHead":span-method="spanMethod":cell-class-name="cellClassName"><el-table-column prop="date" label="日期"> </el-table-column><el-table-column prop="name" label="姓名"> </el-table-column><el-table-column prop="project" label="项目"> </el-table-column><el-table-column prop="address" label="地址" min-width="200"></el-table-column></el-table></div>
</template>
<script>
export default {name: "dataList",components: {},data() {return {tableData: [],};},mounted() {this.getDataMock();},methods: {getDataMock() {for (var i = 0; i < 10; i++) {let randomDay = Math.floor(Math.random() * 5 + 1);this.tableData.push({date: "2024-12-" + randomDay,name: "王小虎" + i,project: "项目" + i,address: "上海市普陀区金沙江路 " + i + " 弄",});}this.tableData.sort((a, b) => {let time1 = new Date(a.date).getTime();let time2 = new Date(b.date).getTime();return time1 - time2;});},cellClassName({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) {return "colorBox";}},spanMethod({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) {// 只有第一列需要合并,所以限定为 columnIndex === 0// 获取当前行的 rowspanlet rowspan = this.getTableDataSpan(this.tableData).spanData[rowIndex];let colspan = rowspan === 0 ? 0 : 1; // 被合并到其他行,需要为 colspan 赋值为 0,否则为 1return {rowspan: rowspan,colspan: colspan,};}},// 动态计算合并行的索引getTableDataSpan(arr) {let spanData = []; // 数据数组的 rowspan 集合// rowspan > 1,合并行// rowspan == 1,单独行,不参与合并// rowspan == 0,被合并的行let lastRowIndex = 0; // 记录索引arr.forEach((item, index) => {if (index == 0) {// 第一行,默认认为不参与合并,记录为 1spanData.push(1);} else {if (item.date == arr[index - 1].date) {// 当前行的 date 与上一行的 date 相同,即当前行 的 rowspan 需要被记为 0spanData.push(0);// 向前找上次记录的索引,即需要当前行合并过去的目标行,使目标行的 rowspan 值加一spanData[lastRowIndex] += 1;} else {// 当前行的 date 与上一行的 date 不相等,则当前行的 rowspan 记录为 1spanData.push(1);// 暂且记录一下 lastRowIndex// 如果下一行与当前行的 date 值相同,就会合并到当前行,否则会更新 lastRowIndex 的值,进行下次对比lastRowIndex = index;}}});return {spanData: spanData,lastRowIndex: lastRowIndex,};},},
};
</script>
<style lang="less" scoped>
.tableBox {background: #fff;padding: 50px 0;/deep/ .myTable {width: 700px;margin: 0 auto;border-radius: 20px;.tableHead {.el-table__cell {background-color: #bee7c5;color: #264f30;border-bottom: none;&:first-child {background: #435f5b;color: #fff;}}}.el-table__body {.el-table__row {.el-table__cell {background: #f7f7f7;border-bottom: 1px solid #dcdcdc;&.colorBox {background: #acb2d9;color: #32405b;font-weight: bold;border-bottom: 1px solid #32405b;}}}}}
}
</style>

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

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

相关文章

druid.properties图标是齿轮

一、问题 在IDEA中&#xff0c; druid.properties图标是齿轮 二、原因 2023版本开始&#xff0c;IDEA新的UI的问题 三、解决方法 1、点击右上角的齿轮图标 2、点击Settings 3、Appearance & Behavior---->New UI---->取消勾选“Enable new UI”---->右下角OK 4…

龙海家园地面停车场探寻2

在南山前海上班2年多了&#xff0c;到现在最喜欢的小区还是龙海家园小区。龙海家园小区是深圳目前最大的公共保障性租赁住房小区,目前居住有约2.6万人。而小区的停车位是远远不够的。之前一直很好奇车子可以停哪里。 后面加班之余经常去小区吃饭和转转。发现龙海家园小区与对面…

群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由 在根目录下route文件夹下修改app.php文件&#xff0c;代码如下&#xff1a; // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…

SQLite Update 语句

SQLite Update 语句 SQLite 的 UPDATE 语句用于更新数据库表中的现有记录。使用 UPDATE 语句&#xff0c;您可以修改一个或多个列的值。本教程将详细介绍如何使用 SQLite UPDATE 语句&#xff0c;包括语法、示例以及一些最佳实践。 语法 SQLite UPDATE 语句的基本语法如下&a…

SQL 单表查询练习题(一)

在 SQL 的学习过程中&#xff0c;单表查询是非常重要的基础部分&#xff0c;下面为大家分享一些单表查询的练习题以及对应的正确答案&#xff0c;希望能帮助大家更好地掌握相关知识。 一、题目及答案详情 1. 查询课程表中&#xff0c;没有前序课程的课程信息&#xff0c;查询…

评估一套呼叫中心大模型呼出机器人的投入回报比?

评估一套呼叫中心大模型呼出机器人的投入回报比&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 评估一套呼叫中心大模型呼出机器人的投入回报比&#xff08;ROI&#xff09;&#xff0c;是一个涉…

探索 HTTP 请求头中的 “Host” 字段及其安全风险

探索 HTTP 请求头中的 “Host” 字段及其安全风险 大家好&#xff0c;今天我们来聊聊 HTTP 请求头中的“Host”字段&#xff0c;以及它的使用方法和安全风险。 什么是Host字段 在 HTTP 请求头中&#xff0c;“Host”字段是一个至关重要的部分。它告诉服务器&#xff0c;我们…

Type-C接口电热毯的创新之旅

在科技日新月异的今天&#xff0c;智能家居产品正逐步渗透到我们生活的每一个角落&#xff0c;从智能灯光到温控系统&#xff0c;无一不展现着科技带来的便捷与舒适。而在这个追求高效与智能化的浪潮中&#xff0c;一款结合了最新科技元素的电热毯——Type-C接口电热毯&#xf…

计算机网络知识点全梳理(一.TCP/IP网络模型)

目录 TCP/IP网络模型概述 应用层 什么是应用层 应用层功能 应用层协议 传输层 什么是传输层 传输层功能 传输层协议 网络层 什么是网络层 网络层功能 网络层协议 数据链路层 什么是数据链路层 数据链路层功能 物理层 物理层的概念和功能 TCP/IP网络模型概述…

C++ 整型数据范围

类型范围int (-2^31~2^31-1) (-2,147,483,648~2,147,483,647) 大概范围(2e9) unsigned int (0~2^32-1) (0~4,294,967,295) 大概范围(4e9) long long (-2^63~2^63-1) (-9,223,372,036,854,775,808,9,223,372,036,854,775,807) 大概范围(9e18) unsigned long long (0~2^64-1) (0~…

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…

.NET Core 各版本特点、差异及适用场景详解

随着 .NET Core 的不断发展&#xff0c;微软推出了一系列版本来满足不同场景下的开发需求。这些版本随着时间的推移逐渐演变为统一的 .NET 平台&#xff08;从 .NET 5 开始&#xff09;。本文将详细说明每个版本的特点、差异以及适用场景&#xff0c;帮助开发者更好地选择和使用…

【Unity】【VR开发】实现VR屏幕共享应用的几个重要插件和参考资料分享

【背景】 做了一个可以在局域网远程屏幕的VR应用&#xff0c;如果有相同兴趣的朋友也可以参考下我用的几个插件。 【使用或相关的关键插件】 piping server&#xff1a;这个是最基底的插件&#xff0c;基于它实现的信令通信。 https://github.com/nwtgck/piping-server/blob…

SpringSecurity使用教程

一、基本使用 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;专门设计用于保护基于 Spring 的应用程序。它不仅提供了全面的安全服务&#xff0c;还与 Spring 框架及其生态系统&#xff08;如 Spring Boot、Spring MVC 等&#xff09;紧密集…

docker 安装mysql 5.7 详细保姆级教程

1. 安装mysql(5.7) docker pull mysql:5.7 若是拉取不了&#xff0c;可以配置下 docker 源 2. 查看是否安装成功 docker images 下图就是成功了 3.创建mysql专用目录、数据挂载目录、配置文件目录 &#xff0c;演示目录在于/home/下 //命令逐条执行cd /home/ mkdir mysql …

活动预告 | Microsoft 365 在线技术公开课:让组织针对 Microsoft Copilot 做好准备

课程介绍 通过Microsoft Learn免费参加Microsoft 365在线技术公开课&#xff0c;建立您需要的技能&#xff0c;以创造新的机会并加速您对Microsoft云技术的理解。参加我们举办的“让组织针对 Microsoft Copilot for Microsoft 365 做好准备” 在线技术公开课活动&#xff0c;学…

fixture装饰器

普通代码案例&#xff1a; python本身执行 import pytestdef init_new():print("init_new...")return Truedef test_case(init_new):if init_new is True:print("如果init_new返回True&#xff0c;就执行用例test_case")if __name__ __main__:#用python本…

【韩顺平Java JDBC学习笔记】

Java JDBC 文章目录 jdbc概述基本介绍jdbc原理示意图 jdbc快速入门JDBC程序编写步骤获取数据库连接5种方式ResultSet[结果集]SQL注入Statement PreparedStatement预处理好处基本使用 JDBC APIJDBCUtils工具类使用工具类 事务基本介绍应用实例模拟经典的转帐业务 - 未使用事务模…

KeepAlive与RouterView缓存

参考 vue动态组件&#xff1c;Component&#xff1e;与&#xff1c;KeepAlive&#xff1e; KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…