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

这篇具有很好参考价值的文章主要介绍了element-ui/view-ui表格的合并行和列的多种方法(超级详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

该方法参数为 4 个对象:

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

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

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

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

效果图:
element-ui/view-ui表格的合并行和列的多种方法(超级详细),vue,ui,vue.js

实现代码:

<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的个数即可;

实现效果图:
element-ui/view-ui表格的合并行和列的多种方法(超级详细),vue,ui,vue.js

第一种写法:

 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赋值为0
      if(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];
      }
 },

以上两种写法的实现原理都是一样的,只是处理的顺序不同,都能实现动态数据下表格的合并;文章来源地址https://www.toymoban.com/news/detail-851427.html

到了这里,关于element-ui/view-ui表格的合并行和列的多种方法(超级详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue2&Element-ui实现表格单元格合并

    由于项目需要实现单元格合并目前只是单页没有做分页处理先上效果图 看下数据结构 Element table提供的api arraySpanMethod columnIndex=0表示从第一列开始 rowIndex表示需要操作的行数 同济医院加上合计有12行从0开始=11 判断条件是rowIndex余12===0 我们打印一下 或者改成 表示从0开始到1

    2024年02月12日
    浏览(33)
  • element-ui添加动态表格并合计行合并行操作

    项目开发过程中,我们有时候会遇到表格里面数据进行动态添加修改删除的操作,表格里面我们也会经常遇到合并单元格和合计累加计算行的数据。这里我们就简单的记录一下实际场景的运用! 最终实现的效果图如下: 注意:这里的新增操作人不能重复添加,新增的时候有

    2024年02月11日
    浏览(54)
  • element-ui 表格(table)合并表头下面合并列且可以收缩展开

    百度了一大堆,发现了首行不能合并,想到了用dom做,找到了下面这个链接 1、表头合并 —— 给table添加属性:header-cell-style=\\\"headerStyle\\\",里面给首行设置跨行 element-ui表头合并 - ^Mao^ - 博客园 2、表内合并 —— 给table添加属性:span-method=\\\"arraySpanMethod\\\",里面设置合并 Element - The wor

    2024年02月16日
    浏览(42)
  • vue中Element-ui 表格 (Table)合并行、列单元格

    先在el-table里加个属性:span-method绑定方法objectSpanMethod(),这个用来把你想合并的列根据你写的逻辑来合并,再写个getSpanArr(),这个写合并的逻辑。 加一个属性两个方法,然后在获取表格数据的时候调用一下getSpanArr(),示例代码写了四个逻辑,根据id相同合并,根据id和其他字段

    2024年02月10日
    浏览(41)
  • [element-ui] el-table表格合并 span-method

    element 中表格合并 span-method 函数详解

    2024年02月13日
    浏览(40)
  • 基于element-ui的table实现树级表格操作及单元格合并

    如题,公司业务需求,数据结构比较复杂,需要在一张表内实现多级树状数据展示及同属性的单元格合并,并在表格内实现增删改操作。 网上翻阅了很多实例,没有能解决所有需求的案例,于是自己实现了一套。 时间匆忙,逻辑有优化的地方还请无偿指出! 最终效果如下

    2024年02月14日
    浏览(35)
  • element-ui 表格一行显示多行内容并实现多行内某一行列合并

    这是加上边框的, 去掉边框后这个表格看着更明显一点,表格一行放多行内容,并让第二行进行列合并,第一行不合并 该方法其实就是普通的列合并,只不过使用了row和col使效果看着像是第一行没合并,第二行才合并

    2024年02月11日
    浏览(49)
  • python 如何获取 excel 表格中数据所在的行和列

    比如有下面一张excel表,我们需要得到“张思德”所在的行和列

    2024年02月12日
    浏览(30)
  • vue3使用view-ui定制主题

    安装view-ui-plus、less、less-loader、style-resources-loader 在main.js(mian.ts)中引入viewUI主键和样式 在vite.config.js中配置css的loaderOptions 首先在项目中先建一个目录,比如  styles ,然后在 styles 下建立一个 less 文件  index.less ,并写入下面内容: 在main.js(mian.ts)中引入 ./styles/ index.le

    2023年04月09日
    浏览(32)
  • element-ui 表格添加校验

      html片段     js片段 css片段

    2024年02月15日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包