欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Antd vue table动态合并单元格

程序员文章站 2024-02-28 17:31:46
...

原理:
合并指定字段,按行遍历,相同的地方rowSpan设为0,第一行设为n(n行重复);

table代码:

 <a-table :columns="methodColumns" :data-source="PreData(methodData,1)" bordered></a-table>

PreData里的参数:methodData为数据源,1为要合并的列顺序,目前的方法只可以处理单列;

columns写法:

const methodColumns = [{title:"部件",dataIndex:"PartsType",customRender: (value, row) => {
      const obj = {
        children: value,
        attrs: {}
      };
      obj.attrs.rowSpan = row.num;
      return obj;
    }},{title:"项目",dataIndex:"ParName"},{title:"值",dataIndex:"ParValue"}];

要合并哪一列就在哪处理,这里有一个问题,因为返回来的flag是按行标记的,如果要合并两列以上,而这几列的flag不同,那么可以多标记几个字段,这里只有一个字段num;然后用的时候需要哪个字段就取哪个就行了。

PreData方法:

PreData(data,col){  //给data加上重复行flag 用来合并单元格
      var num = 1;  //计数

      for(var i=0;i<data.length-1;i++)  //遍历所有行和下一行做比较,这里不处理最后一行,因为最后一行没有下一行,会报错
      {
        var array = Object.keys(data[i]); //遍历每行data的所有属性
        var j = col;
        var index = data[i][array[j]];
        if(index == data[i+1][array[j]]){ //与下一行相同
          data[i+1]['num'] = 0;
          num++;
        }
        if(data[i]['num'] === 0){//在上一层已经被判定为0就不需要加1
          data[i]['num'] = 0;
          if(data[i+1][array[j]] != data[i][array[j]]){
            data[i+1-num]['num'] = num;  //找到最上面一行
          }
        }else{
          data[i]['num'] = num;
        }
      }
      data[data.length-1]['num'] = data[data.length-1]['num'] === 0 ? 0 : 1  //最后一行需要赋值0或1
      return data;
    }

如有问题,欢迎补充。