element-ui/view-ui表格的合并行和列的多种方法(超级详细)

vue的这两个组件库的表格的行和列的写法是一样的,都是通过span-method方法可以实现的;下面我们就以view ui的表格组件为例;

该方法参数为 4 个对象:

  • row: 当前行
  • column: 当前列
  • rowIndex: 当前行索引
  • columnIndex: 当前列索引

该函数可以返回一个包含两个元素的数组,第一个元素代表 rowspan,第二个元素代表 colspan。 也可以返回一个键名为 rowspan 和 colspan 的对象。

看上面对该方法的说明太过于官方,我们直接去组件库把实现的效果图拿过来仔细分析一下;

view ui表格的固定合并行和列

效果图:
在这里插入图片描述

实现代码:

<template><Table :columns="columns14" :data="data5" border :span-method="handleSpan"></Table>
</template>
<script>export default {data () {return {columns14: [{title: 'Date',key: 'date'},{title: 'Name',key: 'name'},{title: 'Age',key: 'age'},{title: 'Address',key: 'address'}],data5: [{name: 'John Brown',age: 18,address: 'New York No. 1 Lake Park',date: '2016-10-03'},{name: 'Jim Green',age: 24,address: 'London No. 1 Lake Park',date: '2016-10-01'},{name: 'Joe Black',age: 30,address: 'Sydney No. 1 Lake Park',date: '2016-10-02'},{name: 'Jon Snow',age: 26,address: 'Ottawa No. 2 Lake Park',date: '2016-10-04'}]}},methods: {handleSpan ({ row, column, rowIndex, columnIndex }) {if (rowIndex === 0 && columnIndex === 0) {return [1, 2];} else if (rowIndex === 0 && columnIndex === 1) {return  [0, 0];}if (rowIndex === 2 && columnIndex === 0) {return {rowspan: 2,colspan: 1};} else if (rowIndex === 3 && columnIndex === 0) {return {rowspan: 0,colspan: 0};}}}}
</script>

所谓的表格合并,其实就是把指定的某个单元格不显示,让显示的单元格吞并不显示的单元格的位置而已;上图表格中就是第一行的第二列隐藏不显示,第一行第一列占据了被隐藏的单元格;第四行的第一列不显示,第三行第一列占据了被隐藏的单元格;

接下来我们来看看代码是实现的;

//Table标签中定义的一个方法属性,用来控制具体某些单元格的显示或者隐藏的
:span-method="handleSpan"
handleSpan({ row, column, rowIndex, columnIndex }){/*row: 行的全部数据column:列的结构及其数据rowIndex:行号,当前是第几行columnIndex:列号,当前是第几列*/
}

handleSpan方法的执行规则:

当表格需要进行合并时、整个渲染方式就发生了变化、之前可以看作以行为单位、一行一行渲染、而当你使用了 :span-method=“handleSpan” 变量后、渲染方式则改为一个单元格一个单元格渲染,即这个方法 handleSpan需要执行的次数是:列的个数 * 行数。
​ 也就是说、它会按照这样的格式去调用方法:(行值,列结构值,行号,列号),具体例子为:
(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);

正是因为每个单元格的渲染都会执行一次,我们才可以在此函数中去写一些逻辑来控制表格的显示和隐藏状态;

下面我们看看handleSpan方法里的具体逻辑,了解一下是怎么控制的:

 handleSpan ({ row, column, rowIndex, columnIndex }) {if (rowIndex === 0 && columnIndex === 0) {return [1, 2];} else if (rowIndex === 0 && columnIndex === 1) {return  [0, 0];}if (rowIndex === 2 && columnIndex === 0) {return {rowspan: 2,colspan: 1};} else if (rowIndex === 3 && columnIndex === 0) {return {rowspan: 0,colspan: 0};}}

列合并

第一个if:

条件为(rowIndex === 0 && columnIndex === 0),意思就是行索引的第0个(也就是第一行)和列索引的第0个(也就是第一列),同时满足这两个条件的就是第一行和第一列的交叉单元格,返回返回一个键名为 rowspan 和 colspan 的对象 [1, 2],对应的就是rowspan :1,就是此单元格在行上就占位自己的一格;colspan :2,就是此单元格在列上要占据两个列单元格,除了自身的的一个单元格还要占据同一列后面的一个单元格;那我们在列上多占一个单元格,那行索引的第0个(也就是第一行)和列索引的第1个(也就是第二列)的单元格要怎么办呢?

第一个else if:

条件为(rowIndex === 0 && columnIndex === 1),意思就是行索引的第0个(也就是第一行)和列索引的第1个(也就是第二列),同时满足这两个条件的就是第一行和第二列的交叉单元格(也就是被占用的单元格),返回返回一个键名为 rowspan 和 colspan 的对象 [0, 0],意思就是在行上和列上都是0,就是不显示了,被隐藏掉了;

行合并

第二个if:

条件为(rowIndex === 2 && columnIndex === 0),意思就是行索引的第2个(也就是第三行)和列索引的第0个(也就是第一列),同时满足这两个条件的就是第三行和第一列的交叉单元格,返回返回一个键名为 rowspan 和 colspan 的对象 [2, 1],对应的就是rowspan :2,就是此单元格在行上要占据两个行单元格,除了自身的的一个单元格还要占据同列另一行的一个单元格;colspan :1,就是此单元格在列上就占位自己的一格;

第二个else if:

条件为(rowIndex === 3 && columnIndex === 0),意思就是行索引的第3个(也就是第四行)和列索引的第0个(也就是第一列),同时满足这两个条件的就是第四行和第一列的交叉单元格(也就是被占用的单元格),返回返回一个键名为 rowspan 和 colspan 的对象 [0, 0],意思就是在行上和列上都是0,就是不显示了,被隐藏掉了;

以上的列和行的合并都是固定的,在已知要显示和隐藏哪一个单元格的情况下是可行的,但是在我们项目中的表格数据都是动态渲染的,就拿行合并来说,需求是把同一列上,行上显示一样的内容合并起来,那我们就不能和上面写的一样的啦,因为我们也不清除要操作哪一行那一列,接下来就要详细说一下动态数据下大额行列合并;

view ui表格的动态数据下的合并行和列

假如数据是后端接口拿来的,我们拿行合并来说,我们也不清楚要合并多少行,从上面给出的例子,我们不难推出;

例如,在第一列的情况下:

  • 合并第一行和第二行,那rowspan分别是2、0、1、1
  • 合并第一行,第二行和第三行,那rowspan分别是3、0、0、1
  • 合并第一行,第二行,第三行和第四行,那rowspan分别是4、0、0、0
  • 合并第二行和第三行,那rowspan分别是1、2、0、1
  • 合并第三行和第四行,那rowspan分别是1、1、2、0

所以说我们在未知数据的情况下,进行行合并,其实我们唯一不清楚的就是某一列下行单元格返回的rowspan的个数,我们只需要分别拿到rowspan的个数即可;

实现效果图:
在这里插入图片描述

第一种写法:

 data(){return {spanArr:[] // 某一列下需要合并的行数pos:0,// 索引}}
getList(){const dataList = [{name: 'John Brown',age: 18,address: 'New York No. 1 Lake Park',date: '2016-10-03'},{name: 'Jim Green',age: 24,address: 'London No. 1 Lake Park',date: '2016-10-01'},{name: 'Joe Black',age: 30,address: 'Sydney No. 1 Lake Park',date: '2016-10-02'},{name: 'Jon Snow',age: 26,address: 'Ottawa No. 2 Lake Park',date: '2016-10-02'}]//dataList 就是接口返回的未知数据this.data5 = dataList this.getSpanArr(res.data)
},getSpanArr(data) {// 遍历数据data.forEach((item,index) => {// 如果是第一个数据,就将列表spanArr添加一个1,表示暂时只有一个名字相同的、且将索引pos赋值为0if(index === 0){this.spanArr.push(1);this.pos = 0}else{// 判断当前元素与上一个元素是否相同(这里我们拿要合并的日期date为例)if(item.date=== data[index - 1].date){// 如果相同就将索引为 pos 的值加一this.spanArr[this.pos] += 1;// 且将数组添加 0 this.spanArr.push(0);}else{// 如果元素不同了,就可以通过索引为 pos 的值知道应该需要合并的行数// 同时,我们再次添加一个值1,表示重新开始判断某个字段的重复次数this.spanArr.push(1);// 同时 索引加一this.pos = index;}}})console.log("索引数组:",this.spanArr) // 索引数组:[1,1,2,0]},handleSpan ({ row, column, rowIndex, columnIndex }){//只合并列字段为date的行if (columnIndex === 0 ) {return {//将需要合并的行数赋值给 _row,注意这里由上一个方法的输出[1,1,2,0]可以知道,rowspan: this.spanArr[rowIndex],//colspan有两种情况要不是0不显示,要不是1显示,根据rowspan( _row)来确定;colspan: _row > 0 ? 1 : 0}}
},

第二种写法:

getList(){const dataList = [{name: 'John Brown',age: 18,address: 'New York No. 1 Lake Park',date: '2016-10-03'},{name: 'Jim Green',age: 24,address: 'London No. 1 Lake Park',date: '2016-10-01'},{name: 'Joe Black',age: 30,address: 'Sydney No. 1 Lake Park',date: '2016-10-02'},{name: 'Jon Snow',age: 26,address: 'Ottawa No. 2 Lake Park',date: '2016-10-02'}]//dataList 就是接口返回的未知数据this.getNewListM(dataList )},
getNewListM(list) {let a = 1;let b = 0;for (let i = 1; i < list.length; i++) {if (list[i].date== list[i - 1].date) {a++;list[b]['1'] = {row: a, col: 1};list[i]['1'] = {row: 0, col: 1};} else {list[i]['1'] = {row: 1, col: 1};a = 1;b = i;}}this.data5 = list},handleSpan({row, column, rowIndex, columnIndex}) {let colinfo = row[columnIndex + ''];if (colinfo) {return [colinfo.row, colinfo.col];}},

以上两种写法的实现原理都是一样的,只是处理的顺序不同,都能实现动态数据下表格的合并;

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

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

相关文章

linux 环境安装配置

安装java17 1.下载安装包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.解压到自定义目录/usr/local/java mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3.配置环境变量 echo export PATH$PATH:/…

神策数据参与制定首份 SDK 网络安全国家标准

国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告&#xff08;2023 年第 13 号&#xff09;&#xff0c;全国信息安全标准化技术委员会归口的 3 项国家标准正式发布。其中&#xff0c;首份 SDK 国家标准《信息安全技术 移动互联网应用程序&#xff0…

HCIE考试第二题:业务容器镜像制作

业务容器镜像制作做题目与题步骤如下 题目 解题步骤 业务容器镜像制作 2.1创建VPC 登录总部SC 创建一个VPC 网段环境有说,租户CCE子网就是 都保持默认,加个描述就好了 创建成功 2.2对等连接Peering 其实就是当前主机连http源那个资源服务器用的。 创建成功 【考试联系考官…

2024年2月游戏手柄线上电商(京东天猫淘宝)综合热销排行榜

鲸参谋监测的线上电商&#xff08;京东天猫淘宝&#xff09;游戏手柄品牌销售数据已出炉&#xff01;2月游戏手柄销售数据呈现出强劲的增长势头。 根据鲸参谋数据显示&#xff0c;今年2月游戏手柄月销售量累计约43万件&#xff0c;同比去年上涨了78%&#xff1b;销售额累计达1…

简单线程池的实现

线程池的代码可以写的很复杂&#xff0c;这里就稍微简单一些 首先来看一下线程池的原则&#xff0c;下面的大框是服务器&#xff0c;而在服务器中维护一个任务队列。 然后在server中预先创建一批线程&#xff0c;这批线程和任务队列合在一起只用向外界提供一个入队列的接口。 …

直流马达驱动芯片D6289ADA介绍

应用领域 适用于智能断路器&#xff08;家用或工业智能空开&#xff09;、新能源汽车充电枪锁、电动玩具、电磁门锁、自动阀门等的直流电机驱动。 功能介绍 D6289ADA是一款直流马达驱动芯片&#xff0c;它有两个逻辑输入端子用来控制电机前进、后退及制动。该电路具有良好的抗干…

[每日一氵] 将服务器的某个端口映射为另一台服务器的ssh连接地址

拓扑结构图&#xff0c;小火龙如何通过服务器A的某个端口ssh连接到服务器B呢? ssh连接准备 首先开启服务器B的ssh连接&#xff0c;若显示: ssh xxlocalhostssh: connect to host localhost port 22: Connection refused也许是ssh没安装 sudo apt-get install openssh-ser…

Linux应用实战之网络服务器(四)JavaScript介绍

0、前言 准备做一个Linux网络服务器应用实战&#xff0c;通过网页和运行在Linux下的服务器程序通信&#xff0c;这是第四篇&#xff0c;介绍一下JS&#xff0c;让HTML网页实现与服务器通信。 1、JS常用语法 JavaScript是一种脚本语言&#xff0c;主要用于前端开发&#xff0…

知识图谱与大数据:区别、联系与应用

目录 前言1 知识图谱1.1 定义1.2 特点1.3 应用 2 大数据2.1 定义2.2 应用 3. 区别与联系3.1 区别3.2 联系 结语 前言 在当今信息爆炸的时代&#xff0c;数据成为了我们生活和工作中不可或缺的资源。知识图谱和大数据是两个关键概念&#xff0c;它们在人工智能、数据科学和信息…

Vulnhub:MY FILE SERVER: 1

目录 信息收集 1、arp 2、nmap 3、whatweb WEB web信息收集 dirmap FTP匿名登录 enum4linux smbclient showmount FTP登录 ssh-kegen ssh登录 提权 系统信息收集 脏牛提权 get root 信息收集 1、arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l I…

Python中模块

基本概念 **模块 module&#xff1a;**一般情况下&#xff0c;是一个以.py为后缀的文件 ①Python内置的模块&#xff08;标准库&#xff09;&#xff1b; ②第三方模块&#xff1b; ③自定义模块。 包 package&#xff1a; 当一个文件夹下有 init .py时&#xff0c;意为该文…

Soot入门学习笔记

Soot 适合参考的文档和教程如下&#xff1a; 北京大学软件分析技术 南京大学软件分析 Tutorials for soot McGill University 198:515 (vt.edu) 比较好的笔记资料&#xff1a; 南京大学《软件分析》课程笔记 比较好的入门作业或者案例&#xff1a; CSCE710 Assignmen…