论element-ui表格的合并行和列(巨细节)

news2025/1/2 2:54:07

论element-ui表格的合并行和列

0、前言

​ 作为一个后端来写前端属实是痛苦、讲真的、刚开始我是真不想用饿了么的这个合并行和列、因为太语焉不详了、看着头疼、后来发现好像我没得选、只好硬着头皮上了。

1、element - ui 的合并行和列代码

效果图:

请添加图片描述

代码:

这里只展示关键代码

<el-table
:data="tableData"
:span-method="objectSpanMethod"
border
style="width: 100%; margin-top: 20px">
    <el-table-column
        prop="id"
        label="ID"
        width="180">
    </el-table-column>
    <el-table-column
        prop="name"
        label="姓名">
    </el-table-column>
    <el-table-column
        prop="amount1"
        label="数值 1(元)">
    </el-table-column>
    <el-table-column
        prop="amount2"
        label="数值 2(元)">
    </el-table-column>
    <el-table-column
        prop="amount3"
        label="数值 3(元)">
    </el-table-column>
</el-table>
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
        if (columnIndex === 0) {
          if (rowIndex % 2 === 0) {
            return {
              rowspan: 2,
              colspan: 1
            };
          } else {
            return {
              rowspan: 0,
              colspan: 0
            };
          }
        }

先看看它们是怎么完成这个的:

首先,看似是合并了行、实际上是让某些行的指定单元个内容不显示,照成了合并的假象,即如上述例子、实际上是有 5 行内容、然后将行的第一列两两合并(就是在这两行中只显示第一行内容,第二行内容被隐藏了),其余列不变、形成合并的假象。

再来分析代码:

​ 分析代码前先搞明白其中的变量有什么用

:span-method="objectSpanMethod"
// 这是在table标签中定义的一个变量,变量值是一个方法,用这个方法去处理然后完成行列合并

2、变量解释

objectSpanMethod({ row, column, rowIndex, columnIndex })
// 由它给的文档我们可以知道、方法会被固定传入一个对象,对象中有上述 4 个变量,其作用是:
/*
	row: 获取此行的全部数据,即你需要传入且展示的数据
	column:获取列的结构及其数据、注意此时列的数据不是指我们传入的数据、而是饿了么自己定义的列结构。
	rowIndex:行号,这个行号表示当前是第几行
	columnIndex:列号,表示当前是第几列
*/
// 相信我虽然解释了变量意义,但是你还是不明白、因为我还有东西没解释。。。

3、方法运行解释

:span-method="objectSpanMethod"
...
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
    ...
}

整个方法的运行:

​ 当表格需要进行合并时、整个渲染方式就发生了变化、之前可以看作以行为单位、一行一行渲染、而当你使用了 :span-method="objectSpanMethod" 变量后、渲染方式则改为一个单元格一个单元格渲染,即这个方法 objectSpanMethod 需要执行的次数是:列的个数 * 行数。

​ 也就是说、它会按照这样的格式去调用方法:(行值,列结构值,行号,列号),具体例子为:

(row, column, 0, 0)、(row, column, 0, 1)、(row, column, 0, 2)、(row, column, 0, 3)、(row, column, 0, 4)

(row, column, 1, 0)、(row, column, 1, 1)、(row, column, 1, 2)、(row, column, 1, 3)、(row, column, 1, 4)

这里括号中的内容表示每一次调用方法 objectSpanMethod 会传入的参数内容,因为前两个参数是由我们实际值决定的,所以先统一使用变量代替。

这样调用有什么用呢?看方法内的代码

if (columnIndex === 0) {  // columnIndex:表示是第几 列 
    if (rowIndex % 2 === 0) { // rowIndex:表示是第几行
        return {
            rowspan: 2,		// 2:需要合并的行数
            colspan: 1		// 1:需要合并的列数
        };
    } else {
        return {
            rowspan: 0,     // 0:只要是0,都代表着不显示
            colspan: 0
        };
    }

看不太懂是吧?不急、接下来详细解释。

1、进入if

​ 因为方法调用是有 4 个参数的、前两个可以先不用看,主要看后两个、观察、想要方法中的第一个 if 执行,我们就必须让 columnIndex = 0 才行、也就是说只要当列号为 0 时,就会执行 if 中的内容,这有啥用呢?因为上述例子是想将第一列的内容两行两行合并,所以我们首先得找到列的位置、也就是索引 0

2、第二个 if

​ 一起理解,第二个 if 的作用是:当行号为 0,2 时,即除以 2 的余数为 0。我们会返回 两个变量,其值为 2 ,1、反之、则返回0、0

有什么用?

​ (2,1):表示将自身以及下一行合并,即合并 2 行、将自身的列合并(如果值是 2 那么就是将自身和右边的一起合并)

我们知道了 2,1 的作用、但还有一个没说、也就是自身所处的行和列位置,显而易见、方法的参数早已把这两个值给我们了。

所以完整理解就是,如果方法参数是:(row, column, 0(行号), 0(列号)) 、那么需要将第 1 行(自身)和第 2 行合并、将第 1列(自身)合并。(0:表示第 1 行,1:表示第 2 行)

但是此时又有个问题了,如果将 1 ,2行合并,那么应该同时有两个ID值在同一行内、但是我们希望只有一个才行、因此需要用到 第二个 if 中的 else 中内容,即 0,0

rowspan: 0, colspan: 0 :结合自身行列号数与(0,0)、整体意思就是说:将处于第 2 行 ,第 1 列的值隐藏,

如此,便做到了只显示一个ID又合并了两个单元格

那如果我想将姓名这一列也做和ID列的同样处理怎么办?

只需要将 if 中的判断条件添加一个,即:

if (columnIndex === 0 || columnIndex === 1) {  // columnIndex:表示是第几 列 
    ...
    }

这样,当方法执行到姓名列时,也会做合并处理。

2、如果是动态数据怎么办?

有时候开发中、我每一次需要合并的行数是不一定相同的、第一个需要合并3行,第二个需要合并6行甚至更多,那怎么办?

回顾一下我们是怎么控制行列合并的?

if (columnIndex === 0) {  // columnIndex:表示是第几 列 
    ===================================================
    =if (rowIndex % 2 === 0) { // rowIndex:表示是第几行=
    ===================================================
        return {
            ======================================
            =	rowspan: 2,	// 2:需要合并的行数    =
            ======================================    
            colspan: 1		// 1:需要合并的列数
        };
    } else {
        return {
            rowspan: 0,     // 0:只要是0,都代表着不显示
            colspan: 0
        };
    }

很显然、我们只需要知道每一次合并的行个数即可,那怎么求呢?

我们开发中后端会给一个数组data我们,这个数组的长度就代表我们需要显示的行数(不考虑合并时),此时我们需要将姓名相同的行进行合并,可以这样做:

return中定义两个变量(我使用的是vue,你们可按需改变,本意思定义全局变量)spanArr:[], // 需要合并的行数
      	pos:0,// 索引

getSpanArr(data) {
    // 遍历数据
    for (let i = 0; i < data.length; i++) {
        // 如果是第一个数据,就将列表spanArr添加一个1,表示暂时只有一个名字相同的、且将索引pos赋值为0
        if (i === 0) {
            this.spanArr.push(1);
            this.pos = 0
        } else {
            // 判断当前元素与上一个元素是否相同
            if (data[i].name === data[i - 1].name) {
                // 如果相同就将索引为 pos 的值加一
                this.spanArr[this.pos] += 1;
                // 且将数组添加 0 
                this.spanArr.push(0);
            } else {
                // 如果元素不同了,就可以通过索引为 pos 的值知晓应该需要合并的行数
                // 同时,我们再次添加一个值1,表示重新开始判断重复姓名的次数
                this.spanArr.push(1);
                // 同时 索引加一
                this.pos = i;
            }
        }
    }
    console.log("索引数组:")
    console.log(this.spanArr)
},
===================
/*
spanArr最终的值格式是:
[3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0, 3, 0, 0]
3代表需要合并的行数,0代表此单元格需要被隐藏(当然这个作用会在`objectSpanMethod` 方法中体现,现在只是准备数据)
*/
    
    objectSpanMethod({ row, column, rowIndex, columnIndex }){

    /* 此方法总共运行次数与有几列几行有关,如果有5列30行,那么都是从0开始作为第一行第一列,
      (行,列):0,0 0,1 0,2 0,3 0,4 0,5 1,0...*/
    // 0,1,5表示需要处理 第 1,2,5列的行进行合并处理
    if (columnIndex === 0 || columnIndex === 1 || columnIndex === 5) {
        /* 
        将需要合并的行数赋值给 _row,注意这里由上一个方法的输出可以知道,这里的值可以是 3或者0
        当为 3 时,表示将当下的第 rowIndex+1 行与第 columnIndex+1 列所指向的单元格向下合并 _row 格
        当为 0 时,表示将当下的第 rowIndex+1 行与第 columnIndex+1 列所指向的单元格隐藏
        */
        const _row = this.spanArr[rowIndex];
        const _col = _row > 0 ? 1 : 0;
        return {
            rowspan: _row,
            colspan: _col
        }
    }


},

最终结果:

请添加图片描述

3、变量值展示

注:这只是某个单元格调用方法时的变量值
请添加图片描述

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

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

相关文章

SpringSecurity环境搭建

AOP思想&#xff1a;面向切面编程 导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

【算法题】螺旋矩阵II (求解n阶Z形矩阵)

一、问题的提出 n阶Z形矩阵的特点是按照之(Z)字形的方式排列元素。n阶Z形矩阵是指矩阵的大小为nn&#xff0c;其中n为正整数。 题目描述 一个 n 行 n 列的螺旋(Z形)矩阵如图1所示&#xff0c;观察并找出填数规律。 图1 7行7列和8行8列的螺旋(Z形)矩阵 现在给出矩阵大小 n&…

异步电机模型预测转矩控制MPTC关键技术(1、一拍延迟补偿)

导读&#xff1a;本期文章主要介绍异步电机模型预测转矩控制MPTC中的一拍延迟补偿的内容。先进性一拍延迟补偿原理的介绍&#xff0c;之后进行仿真验证补偿的有效性。 如果需要文章中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;留言获取。 一…

Vue输入框或者选择框无效,或者有延迟

问题剖析 使用Vue这种成熟好用的框架&#xff0c;一般出现奇奇怪怪的问题都是因为操作不当导致的&#xff0c;例如没有合理调用组件、组件位置不正确、没有合理定义组件或者变量、样式使用不当等等... 解决方案 如果你也出现了输入框输入东西&#xff0c;但是没有效果…

Qt扫盲-Qt Model/View 理论总结 [下篇]

Qt Model/View 理论总结 [下篇] 一、处理I tem view 中的选择1. 概念1. 当前项目和已选项目 2. 使用选择 model1. 选择项目2. 读取选区状态3. 更新选区4. 选择 model 中的所有项 二、创建新 model1. 设计一个 model2. 只读示例 model1. model 的尺寸2. model 头和数据 3. 可编辑…

视频号产业带服务商申请详细指南!

在各大电商平台中&#xff0c;产业带服务商是一个不可或缺的角色。他们是在商家背后提供支持的群体&#xff0c;也是电商平台生态中不可或缺的一环。 近日&#xff0c;视频号对产业带服务商进行了新一轮的公示&#xff0c;新增补录共9家产业带申请找cmxyci服务商。其中服饰行业…

nextjs中使用image图片

使用nextjs的组件&#xff1a; import Image from "next/image";<Image src"xxx" alt"图片" width{300} height{300} />加入允许跨域&#xff1a; 在next.config.js中加入 const nextConfig {images: {domains: ["images.doc.ceo&q…

spring-自定义AOP面向切面注解--统一切面处理-登陆信息采集

2023华为OD统一考试&#xff08;AB卷&#xff09;题库清单-带答案&#xff08;持续更新&#xff09;or2023年华为OD真题机考题库大全-带答案&#xff08;持续更新&#xff09; 1. 先写一个登陆记录注解&#xff08;//记录&#xff1a;XXX时间&#xff0c;XXX姓名&#xff0c;XX…

Python + ttkbootstrap 制作全网小说下载神器

前言 ttkbootstrap是一个基于Python的开源库&#xff0c;用于创建漂亮且交互式的GUI应用程序。它是在Tkinter框架之上构建的&#xff0c;提供了一系列的Widget组件和样式&#xff0c;可以帮助开发者快速构建现代化的用户界面。 今天做的是这个东西&#xff0c;蓝色的是进度条…

[管理与领导-10]:IT基层管理者 - 目标、责任、落实 - 如何把管理者的高高在上的目标,落地、落实到团队实施

目录 前言&#xff1a; 情形1&#xff1a;下属不知如何下手 情形2&#xff1a;下属不敢承诺 情形3&#xff1a;下属能力不够 情形4&#xff1a;奖罚机制失效&#xff0c;干活的动力不够 补充&#xff1a;目标与落实过节的进一步分析 1. 目标分解出了问题&#xff1a;目…

abbitmq启动访问不了http://localhost:15672 通过修改服务登录admin

abbitmq默认的对Administration授权&#xff0c;而我的用户不是默认的Administration&#xff0c;所以后来打开服务&#xff0c;找到rabbitmq服务&#xff0c;属性&#xff0c;登陆&#xff0c;将本地系统账户修改为此账户&#xff0c;修改完成之后再重启服务&#xff0c;这时候…

“探索计算机世界:进程的基本概念与功能“

文章目录 前言什么是进程如何描述进程进程的属性1. 进程标识符2. 内存指针3. 文件描述符表4. 进程的状态5. 优先级6. 上下文7. 记账信息 内存分配并行和并发 前言 作为程序员&#xff0c;理解计算机的组成以及计算机是怎样运行的是很重要的&#xff0c;因为只有了解计算机我们…

SQL-每日一题【1517. 查找拥有有效邮箱的用户】

题目 表: Users 编写一个解决方案&#xff0c;以查找具有有效电子邮件的用户。 一个有效的电子邮件具有前缀名称和域&#xff0c;其中&#xff1a; 前缀 名称是一个字符串&#xff0c;可以包含字母&#xff08;大写或小写&#xff09;&#xff0c;数字&#xff0c;下划线 _ &…

解决MySQL与Redis缓存一致性的问题

背景 考试系统中&#xff0c;教师会在后台发布一场考试&#xff0c;考试会存储在MySQL和Redis里面&#xff0c;考试有时候是会出错的&#xff0c;我们需要后台修改&#xff0c;如果多个教师在后台并发修改&#xff08;概率不大&#xff09;&#xff0c;可能会出现数据库缓存不…

【mysql】MySQL CUP过高如何排查?

文章目录 一. 问题锁定二. QPS激增会导致CPU飘高三. 慢SQL会导致CPU飘高四. 大量空闲连接会导致CPU飘高五. MySQL问题排查常用命令 一. 问题锁定 通过top命令查看服务器CPU资源使用情况&#xff0c;明确CPU占用率较高的是否是mysqld进程&#xff0c;如果是则可以明确CUP飘高的原…

Java类和对象(一文读懂)

文章目录 类、对象是什么&#xff1f;创建类构造器 创建对象 类、对象是什么&#xff1f; 类&#xff1a;类是一个模板&#xff0c;它描述一类对象的行为和状态。类可以看成是创建 Java 对象的模板。 对象&#xff1a;对象是类的一个实例&#xff08;对象不是找个女朋友&#x…

自动驾驶——驶向未来的革命性技术

自动驾驶——驶向未来的革命性技术 自动驾驶的组件自动驾驶的优势自动驾驶的应用自动驾驶的未来中国的自动驾驶 自动驾驶是一种技术&#xff0c;它允许车辆在没有人类驾驶员的情况下自主地进行行驶。它利用各种传感器、计算机视觉、人工智能和机器学习算法来感知和理解周围环境…

大模型开源,创业者又站在了同一起跑线

先聊聊最近接触的几个创业者&#xff0c;AI 领域的。有两位做艺术二维码变现的&#xff0c;一个模式比较简单 PSSD&#xff0c;另一个有点技术含量&#xff0c;预训练好几张图&#xff0c;让用户上传自己的二维码&#xff0c;再生成新的二维码&#xff0c;形式上要比 PS 的自动…

【单片机毕业设计】【hj-001】温度控制 | 恒温箱 | 保温箱 | 恒温孵化器 | 环境检测 | 温度检测

一、基本介绍 项目名&#xff1a; 基于单片机的温度控制系统设计 基于单片机的恒温箱系统设计 基于单片机的保温箱系统设计 基于单片机的恒温孵化器系统设计 基于单片机的环境检测系统设计 基于单片机的温度检测系统设计 项目编号&#xff1a;mcuclub-hj-001 单片机类型&…

Apache Paimon 在同程旅行的实践进展

摘要&#xff1a;本文整理自同程旅行大数据计算组负责人吴祥平&#xff0c;在 Apache Paimon Meetup 的分享。本篇内容主要分为四个部分&#xff1a; 1. Apache Paimon 引入 2. Apache Paimon 应用建设 3. Apache Paimon 优化实践 4. 未来规划和期待 Tips&#xff1a;点击「阅读…