使用element UI实现表格行/列合并

embedded/2024/11/14 20:17:56/

前言

本文代码使用vue2+element UI,通过给table传入span-method方法实现合并行或列

效果图

示例代码

后端返回数据格式如下

javascript">{"total": 12,"records": [[{"id": 1,"project": "田径","subitem": "100米","category": "决赛","score": 9.6,"creator": "张三","competitionName": "国际田联锦标赛","date": "2023-08-15","location": "北京","worldRecord": "1","asiaRecord": "0"},{"id": 2,"project": "田径","subitem": "100米","category": "资格赛","score": 10.1,"creator": "李四","competitionName": "全国田径锦标赛","date": "2023-09-01","location": "上海","worldRecord": "0","asiaRecord": "0"}],[{"id": 3,"project": "田径","subitem": "200米","category": "决赛","score": 19.2,"creator": "王五","competitionName": "国际田联锦标赛","date": "2023-08-15","location": "北京","worldRecord": "1","asiaRecord": "0"},{"id": 4,"project": "田径","subitem": "200米","category": "资格赛","score": 20.5,"creator": "赵六","competitionName": "全国田径锦标赛","date": "2023-09-01","location": "上海","worldRecord": "0","asiaRecord": "0"}],[{"id": 15,"project": "田径","subitem": "跳远","category": "决赛","score": 8.4,"creator": "马十三","competitionName": "国际田联锦标赛","date": "2023-08-15","location": "北京","worldRecord": "0","asiaRecord": "1"},{"id": 16,"project": "田径","subitem": "跳远","category": "资格赛","score": 7.8,"creator": "李十四","competitionName": "全国田径锦标赛","date": "2023-09-01","location": "上海","worldRecord": "0","asiaRecord": "0"}]]
}

分析后端返回数据 :

records 是一个 二维数组,el-tabledata 属性通常期望的是 一维数组。

所以需要将records中的二维数组 扁平化为一维数组,再赋值。

代码如下

javascript"><template><div class="record-manage-container"><el-table :data="recordList" :span-method="mergeCells"><el-table-column prop="project" label="项目" width="180" /><el-table-column prop="subitem" label="小项" width="180"/>              <el-table-column prop="category" label="类别" /><el-table-column prop="score" label="成绩" /><el-table-column prop="creator" label="创造者" /><el-table-column prop="competitionName" label="比赛名称" /><el-table-column prop="date" label="日期" /><el-table-column prop="location" label="地点" /><el-table-column prop="worldRecord" label="世界纪录" /><el-table-column prop="asiaRecord" label="亚洲纪录" /></el-table></div>
</template><script>
import { recordList } from "@/api/game/scoreManage";
export default {data() {return {recordList:[],};},created() {this.getRecordList()},methods: {// 获取纪录列表getRecordList() {// 在此处调用获取数据的接口recordList().then(res => {// console.log(res)// 扁平化 records 为一维数组this.recordList = res.records.flat()this.total = res.total})},mergeCells({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) {// 合并 "项目" 列const project = row.project;const prevProject = rowIndex > 0 ? this.recordList[rowIndex - 1].project : null;if (project === prevProject) {// 当前项目与上一行项目相同,隐藏当前单元格return [0, 0];} else {// 当前项目与上一行不同,计算合并行数const spanCount = this.recordList.filter(item => item.project === project).length;return [spanCount, 1]; // 合并 `spanCount` 行,列合并为 1}}if (columnIndex === 1) {// 合并 "小项" 列const subitem = row.subitem;const prevSubitem = rowIndex > 0 ? this.recordList[rowIndex - 1].subitem : null;if (subitem === prevSubitem) {return [0, 0];} else {const spanCount = this.recordList.filter(item => item.subitem === subitem).length;return [spanCount, 1];}}// 其他列不合并,返回默认值return [1, 1];},}
};
</script><style lang="scss" scoped>
.record-manage-container {padding: 20px;.title{font-size: 24px;font-weight: bold;}
}
</style>

分析

1. res.records.flat():将 records 中的二维数组扁平化为一维数组。例如:

javascript">const records = [[{ id: 1 }, { id: 2 }],[{ id: 3 }, { id: 4 }]
];
const flattened = records.flat();
console.log(flattened); // [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }]

2. mergeCells()方法的实现逻辑

合并“项目”列 (columnIndex === 0)

  • 判断当前行与上一行的项目 (project) 是否相同。
  • 如果相同,返回 [0, 0],表示隐藏当前单元格,因为它会被上一个单元格合并。
  • 如果不同,则计算相同项目的行数 spanCount,返回 [spanCount, 1],表示合并 spanCount 行,列合并为 1。

合并“小项”列 (columnIndex === 1)

  • 判断当前行与上一行的小项 (subitem) 是否相同。
  • 如果相同,返回 [0, 0],隐藏当前单元格。
  • 如果不同,计算相同小项的行数 spanCount,返回 [spanCount, 1]

默认情况

  • 对于其他列(比如类别、成绩、创造者等),不需要进行合并,直接返回 [1, 1] 表示不合并。

http://www.ppmy.cn/embedded/137584.html

相关文章

探索Scala编程:图书管理系统实战

在这篇文章中&#xff0c;我们将通过一个简单的图书管理系统项目来深入理解Scala编程。这个项目不仅会帮助你掌握Scala的基本操作&#xff0c;还会让你了解如何使用Scala来处理实际问题。准备好了吗&#xff1f;让我们开始吧&#xff01; 项目目标 我们的目标是创建一个图书管…

1.2 数据结构的分类与应用

1.2 数据结构的分类与应用 数据结构&#xff0c;就是字面意思&#xff0c;一门用来研究数据如何高效的在计算机中进行存储和查询的学科。几乎所有的数据结构&#xff0c;也都是从生活中和数学理论中&#xff0c;衍生而来。 下表列出了常见的数据结构&#xff0c;我们先来熟悉一…

七大经典基于比较排序算法【Java实现】

七种基于比较的排序算法 一.直接插入排序:1.1插入排序1.2希尔排序&#xff08;缩小增量排序法&#xff09; 二.选择排序2.1选择排序2.2堆排序&#xff08;基于树&#xff08;堆&#xff09;的数据结构&#xff09; 三.交换排序3.1冒泡排序3.1快速排序(大致分三种partition方法)…

MySQL第九章,数据访问和DAO模式

一、数据访问与Properties配置文件 数据访问是应用程序与数据库之间的交互过程。在Java开发中&#xff0c;我们通常使用JDBC&#xff08;Java Database Connectivity&#xff09;来实现数据访问。然而&#xff0c;直接编写JDBC代码可能会导致代码冗长、难以维护&#xff0c;并…

Springboot整合xxl-job

拉取xxl-job xxl-job: 一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 配置项目 执行sql语句 更改配置 启动 访问 任务调度中心http://127.0.0.1:8081/xxl-job-…

【图像压缩感知】论文阅读:Self-supervised Scalable Deep Compressed Sensing

tips&#xff1a;本文为个人阅读论文的笔记&#xff0c;仅作为学习记录所用。 Title&#xff1a;Self-supervised Scalable Deep Compressed Sensing Journal&#xff1a;IJCV 2024 代码链接&#xff1a;GitHub - Guaishou74851/SCNet: Self-Supervised Scalable Deep Comp…

反向代理模块

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

vite-plugin-svg-icons 库作用

一、 图标管理与整合 1. 自动扫描与注册 该插件能够自动扫描指定目录下的 .svg 文件&#xff0c;并将这些文件注册为 Vue 组件。 这意味着开发者无需手动逐个导入 .svg 文件&#xff0c;大大简化了在 Vue 项目中使用 SVG 图标的过程。 例如&#xff1a;如果项目中有一个 ic…