element-ui Table :span-method(实现多列行合并)

element-ui官网中的例子特别简单,但实际的原理也是那么如此。解析一下示例代码的意思:

objectSpanMethod({ row, column, rowIndex, columnIndex }) {
        if (columnIndex === 0) {//哪一列可以合并(第一列)
          if (rowIndex % 2 === 0) {//满足合并行的条件(偶数行)
            return {
              rowspan: 2,//合并的行数
              colspan: 1 //合并的列数,设为0则直接不显示
            };
          } else {
            return {
              rowspan: 0,
              colspan: 0
            };
          }
        }
      }

具体解释参考地址:

https://blog.csdn.net/qq_29468573/article/details/80742646

有了前面大佬的讲解之后,大佬的例子只有一行需要合并,如果多行肯定需要很多组spanArr和pos对应存储对应行的合并信息。这样在data里面疯狂定义这样的数据会十分的不优雅,所以我简化了定义和数据的操作如下:

// 表格数据
tableData: [
                {dmsPostName: '经理', dmsRoleName: '二级人事', hrPostName: 'KA专员'},
                {dmsPostName: '经理', dmsRoleName: '二级业务', hrPostName: 'v顾问'},
                {dmsPostName: '政企专员', dmsRoleName: '二级业务', hrPostName: '二级业务'},
                {dmsPostName: 'v主管', dmsRoleName: 'v主管', hrPostName: '培训专员'},
            ], 
//data里面需要合并的项以及对应的spanArr和pos
mergerItems: [
                {   columnIndex:1,
                    spanArr: [],
                    pos: 0,
                    prop: 'dmsPostName'
                },
                {   columnIndex:2,
                    spanArr: [],
                    pos: 0,
                    prop: 'dmsRoleName'
                }]

上面是数据的定义下面是需要用到的方法:

cellMerge({row, column, rowIndex, columnIndex}) {//表格合并的方法
                if (columnIndex === 1 || columnIndex === 2) {//这里判断第几列需要合并
                    let item = this.mergerItems.find(item => item.columnIndex === columnIndex)
                    const _row = item.spanArr[rowIndex];
                    const _col = _row > 0 ? 1 : 0;
                    return {
                        rowspan: _row,
                        colspan: _col,
                    }
                }
            },
getSpanArr(data, array) {//循环数据处理
                for (let n = 0; n < array.length; n++) {
                    array[n].spanArr = []//数据清空(重新调此方法的时候需要清空上一次的数据)
                    for (let i = 0; i < data.length; i++) {
                        if (i === 0) {
                            array[n].spanArr.push(1);
                            array[n].pos = 0;
                        } else {
                            // 判断当前元素与上一个元素是否相同
                            if (data[i][array[n].prop] === data[i - 1][array[n].prop]) {
                                array[n].spanArr[array[n].pos] += 1;
                                array[n].spanArr.push(0);
                            } else {
                                array[n].spanArr.push(1);
                                array[n].pos = i;
                            }
                        }
                    }
                }
			},

上面数据需要注意的是mergerItems里面columnIndex 一定要与你需要合并的列对应上:例如我这个就是第一列以及第二列合并(因为columnIndex 就是一个标记,可以根据这个字段找到对应的列下面所记录需要合并行的信息)。mergerItems里面prop对应的就是tableData里面需要合并的字段对应上(这里的tableData我写死了,具体tableData的数据还是得看后台怎么定义的),例如我的就是dmsPostName和dmsRoleName其实合并的就是“经理”和“二级业务”字段效果如下图
合并效果
调用:this.getSpanArr(this.tableData, this.mergerItems)在请求到表格数据后进行调用或者表格数据更新后再次调用。

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Element-UITable组件中,如果需要将中相邻的同类项合并,可以使用自定义的合并函数来实现。具体骤如下: 1. 首先,在Table组件中设置`row-span-method`属性为一个自定义的方法名,例如`mergeRows`。 2. 在Vue实例中定义`mergeRows`方法,该方法接收三个参数:当前数据(row)、当前列数据(column)、当前索引(rowIndex)。 3. 在`mergeRows`方法中,判断当前与上一是否需要合并。如果需要合并,则返回合并数(即rowspan),否则返回1。 4. 在模板中,使用`row-span-method`属性绑定到自定义的合并函数。 下面是一个示例代码: ```html <template> <el-table :data="tableData" row-span-method="mergeRows"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> <el-table-column prop="gender" label="性别"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20, gender: '男' }, { name: '李四', age: 22, gender: '男' }, { name: '王五', age: 22, gender: '男' }, { name: '赵六', age: 25, gender: '女' }, { name: '钱七', age: 25, gender: '女' }, ], }; }, methods: { mergeRows(row, column, rowIndex) { if (rowIndex === 0) { return 1; // 第一不需要合并 } const prevRow = this.tableData[rowIndex - 1]; if (row.age === prevRow.age && row.gender === prevRow.gender) { return 0; // 合并数为0,表示与上一合并 } return 1; // 不需要合并 }, }, }; </script> ``` 这样,相邻的同类项就会合并为一显示在Table组件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值