Advertisement

elementUI table表格动态合并行

阅读量:

该组件提供了一个直观的界面来呈现大量具有相似特征的数据记录,并支持排序功能、筛选选项以及比较模式等多种自定义设置。

在实际项目中,当遇到需要固定合并行或列的情况时,在表格对象中传递一个名为spanMethod的函数,并将其参数设置为包含当前行、当前列、当前行号和当前列号四个属性的对象。该函数的功能是实现对行或列的合并操作,并根据需要返回一个包含两个元素的数组(表示rowspan和colspon)或者是一个包含属性 named rowSpancolSpan 的对象。

本文先阐述合并固定行的例子,然后再阐述合并动态行的例子。

1. 合并固定行及固定列

前后方处理完成后,在线前端系统将根据需求接收后方返回的数据,并在本地展示成如图所示的表格形式。而后方返回的数据呈现方式如图所示:

前台拿到数据后,首先获取数据长度:

复制代码
    this.dataLen = this.dataList.length
    
    AI写代码

然后对第一列进行合并:

复制代码
     if (columnIndex === 0) {    // 第一列

    
       if (rowIndex === 0) {    // 第一行时,合并dataLen行1列
    
         return {
    
           rowspan: this.dataLen,
    
           colspan: 1,
    
         }
    
       } else {        // 其他行时,合并0行0列
    
         return {
    
           rowspan: 0,
    
           colspan: 0,
    
         }
    
       }
    
     }
    
    
    
    
    AI写代码

接下来对第二列进行合并:

复制代码
     if (columnIndex === 1) {    // 第1列

    
       if (rowIndex === 0) {     // 第一行时,合并dataLen - 1行1列
    
         return {
    
           rowspan: this.dataLen - 1,
    
           colspan: 1,
    
         }
    
       } else if (rowIndex == this.dataLen - 1) {    // 最后一行时,合并1行1列
    
         return {
    
           rowspan: 1,
    
           colspan: 1,
    
         }
    
       } else {
    
         return {                // 其他行时,合并0行0列
    
           rowspan: 0,
    
           colspan: 0,
    
         }
    
       }
    
     }
    
    
    
    
    AI写代码

最后,对最后一行进行合并:

复制代码
     if (rowIndex === this.dataLen - 1) {    // 最后一行

    
       if (columnIndex === 2) {              // 第3列,合并1行9列
    
         return [1, 9]
    
       } else {                              // 其他行,合并1行1列
    
         return [1, 1]
    
       }
    
     }
    
    
    
    
    AI写代码

至此,合并固定行列的例子就完成了。接下来阐述合并动态行的例子,如下。

前三列中可能会将1至多几行列进行整合?具体来说,并根据后台返回的数据来确定具体需要整合多少行列

复制代码
       [

    
     {
    
       rkNum: 'RK000005',
    
       date: '2021-08-09',
    
       wlCompany: '504厂',
    
       purchaseQuantity: 2.0,
    
       barCode: 'CP000001',
    
       barName: '按键板',
    
       barType: '504厂',
    
       barUnit: '件',
    
       barNum: 2,
    
       barPrice: 0,
    
       remark: '',
    
     },
    
     {
    
       rkNum: 'RK000004',
    
       date: '2021-07-20',
    
       wlCompany: '504厂',
    
       purchaseQuantity: 2.0,
    
       barCode: 'CP000001',
    
       barName: '按键板',
    
       barType: '504厂',
    
       barUnit: '件',
    
       barNum: 5,
    
       barPrice: 0,
    
       remark: '',
    
     },
    
     {
    
       rkNum: 'RK000004',
    
       date: '2021-07-20',
    
       wlCompany: '504厂',
    
       purchaseQuantity: 2.0,
    
       barCode: 'CP000002',
    
       barName: '显示屏',
    
       barType: '504厂',
    
       barUnit: '件',
    
       barNum: 5,
    
       barPrice: 0,
    
       remark: '',
    
     },
    
       ]
    
    
    
    
    AI写代码

前端接收来自后端返回的数据。
对这些数据进行处理。
统计每条记录需要合并的条数。
代码如下:

复制代码
       this.tableList = res.result

    
  
    
       for (var i = 0; i < this.tableList.length; i++) {
    
     if (i === 0) {
    
           this.spanArr.push(1);
    
           this.pos = 0
    
     } else {
    
       // 判断当前元素与上一个元素是否相同
    
       if (this.tableList[i].rkNum === this.tableList[i - 1].rkNum) {
    
         this.spanArr[this.pos] += 1;
    
         this.spanArr.push(0);
    
       } else {
    
         this.spanArr.push(1);
    
         this.pos = i;
    
       }
    
     }
    
       }
    
  
    
       console.log(this.spanArr)
    
    
    
    
    AI写代码

其中tableList是从后台获取的一组数据;一般情况下是一个数组;spanArr则被用作存储每一行记录的合并数;而pos则是(spanArr)中的一个索引值。
上述代码的基本逻辑如下:当处理第一条记录(其索引为0)时,在spanArr中插入数值1,并标记该位置;而对于后续的非第一条记录,则需比较当前记录与前一条记录的状态:如果两者相等,则在spanArr中添加元素0(表示该行不应显示);同时将前一位元素加1以表示合并次数;以此类推循环操作直至完成所有行数的合并统计。

然后基于获得的合并后的数组spanArr,完成表格的连接到合并方法中。

复制代码
 <el-table :data="tableList" border stripe :span-method="cellMerge">

    
 </el-table>
    
    
    
    
    AI写代码
复制代码
     cellMerge({ row, column, rowIndex, columnIndex }) {

    
       if (columnIndex === 0 || columnIndex === 1 || columnIndex === 2) {
    
     const _row = this.spanArr[rowIndex];
    
     const _col = _row > 0 ? 1 : 0;
    
     return {
    
       rowspan: _row,
    
       colspan: _col
    
     }
    
       }
    
     },
    
    
    
    
    AI写代码

至此,动态合并行功能完成。

在处理数据时需要注意以下几点:当后端返回数据时(尤其是具有相同的rkNum值的数据),应依次返回以保持顺序;同时在重新加载数据时,请确保清除spanArr数组以避免合并混乱。

全部评论 (0)

还没有任何评论哟~