动态合并行和列(element-ui)

动态合并行和列

根据key值是否相同来合并 列或行。

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

核心思想是构造存放rowspan,colspan 对应关系的数组。

element-ui 提供span-method 的方法。 具体查看文档。

<el-table :data="listData" border :span-method="arraySpanMethod">
 // 构造  this.rowspanMapArr  如下图所示
 // 构造  this.colspanMapArr  如下图所示
 
 arraySpanMethod({ row, column, rowIndex, columnIndex }) {
        return {
          rowspan: this.rowspanMapArr[columnIndex][rowIndex],
          colspan: this.colspanMapArr[rowIndex][columnIndex],
        };
    },

在这里插入图片描述
对应的key 数组。

   const keyMap = [
          'key1',
          'key2',
          'key3',
          'key4',
      ]

// arraySpanMethod 里面用了下标,所以不在keyMap 除去不合并的 key

const norMergeKeyArr = [
    'key4',
]   
 data(){
    return {
       listData: [
              {
                 key1:'上下行合并',
                 key2:'1111'
                 key3:''
              },
                {
                 key1:'上下行合并',
                 key2:'1111'
                 key3:''
              },
                {
                 key1:'左右列合并', 
                 key2: null
                 key3: null
              },
       ]
    } 
 },
 created(){
     console.log('listData.length-->', this.listData.length)
     keyMap.forEach((keyName, innerIndex) => {
        this.rowspanMapArr.push(this.rowspan( [], 0, keyName) ) 
     })
     console.log('rowspanMapArr---> ',this.rowspanMapArr)
     this.genrateColspanArr();
 },
 methods: {
   rowspan(spanArr, position, spanName) {
     this.listData.forEach((item, index) => {
         if( norMergeKeyArr.includes(spanName)){
              spanArr.push(1);
         }else{
             if (index === 0) {
               spanArr.push(1);
               position = 0;
               } else {
                   if (
                       this.listData[index][spanName] ===
                       this.listData[index - 1][spanName]
                   ) {
                       spanArr[position] += 1;
                       spanArr.push(0);
                   } else {
                       spanArr.push(1);
                       position = index;
                   }
               }
         }
     });
     return spanArr
   },
   genrateColspanArr() {
     this.listData.forEach((item, outIndex) => {
         let curPos ;
         let colMapArr = []
         keyMap.forEach((keyName, innerIndex) => {
            if ( innerIndex === 0 && item[keyName] ) {
                       colMapArr.push(1);
                       curPos = 0;
                   } else {
                   //。左右列合并 通过判断 key 是否为 null 之类的,具体情况具体分析。
                   // 最好用lodash 之类工具判断  
                       if ( !item[keyName] && item[keyName] != 0 ) {
                           colMapArr[curPos] += 1;
                           colMapArr.push(0);
                       } else {
                           curPos = innerIndex
                           colMapArr.push(1);
                       }
               }
        })
        this.colspanMapArr.push(colMapArr)
     });
     console.log('colspanMapArr--',this.colspanMapArr)
   },
   arraySpanMethod({ row, column, rowIndex, columnIndex }) {
       return {
         rowspan: this.rowspanMapArr[columnIndex][rowIndex],
         colspan: this.colspanMapArr[rowIndex][columnIndex],
       };
   },
 },

总结:

这里分rowspan 和 colsan 情况。

  1. 根据数据源的同个key 的value值是否一致,来判断是否上下行合并。 计算出各个rowspan的值。
  2. 根据单条数据源内的key对应的value值,要保证一定的顺序。也就是说,下一个key的value值为null,上一个key的value值不为null 而合并,计算出各个 colspan 值。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值