VUE合并行

参考文章:Element - The world's most popular Vue UI framework 

Element UI中合并行真是坑人啊,你想使用它,你必须先知道哪些是要合并的才行,所以在列表加载之前,我们要做准备工作。

export default {
  data(){
    return{
      //主列表
      dataObj:[],

      //通过计算得知需要合并的行
      mergeList:[],

      //需要合并的字段
      //column:列,从0开始
      //name:此列的字段
      //maxName:根据上一个字段进行合并
      keyList:[
        {column:1,name:'aaa',maxName:'aaa'},
        {column:2,name:'bbb',maxName:'aaa'},
        {column:3,name:'ccc',maxName:'aaa'},
        {column:4,name:'ddd',maxName:'ccc'},
      ],
    }
  },

加载列表的时候,需要先清空主列表和需要合并的列表,一定要清空,一定要清空,一定要清空(重要的事情说三遍),查询出结果后,先去寻找我们要合并的行,再去加载主列表,顺序不能乱。

加载主列表的时候需要合并行,我写了个js,可以复用给其它页面使用。

<template>
    <el-table :data="dataObj.items" border>
        <el-table-column label="序号" type="index" align="center" width="55px"></el-table-column>
        <el-table-column show-overflow-tooltip label="aaa" prop="aaa" min-width="120px"></el-table-column>
        <el-table-column show-overflow-tooltip label="bbb" prop="bbb" min-width="120px"></el-table-column>
        <el-table-column show-overflow-tooltip label="ccc" prop="ccc" min-width="120px"></el-table-column>
        <el-table-column show-overflow-tooltip label="ddd" prop="ddd" min-width="120px"></el-table-column>
    </el-table>
</template>
import basicUtil from "../../util/basicUtil";
export default {

methods:{
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
        return basicUtil.objectSpanMethod(row,rowIndex,columnIndex,this.keyList,this.mergeList);
    },
    getInfo(){
        //每次查询都要清空
        this.$set(this,'dataObj',[]);
        this.$set(this,'mergeList',[]);
        getList({}).then(res=>{
            if(res.success){
                let result = res.result;
                //有需要的先排序
                //计算合并值
                basicUtil.mergeSetKey(this.keyList,result,this.mergeList);
                //加载主列表
                this.$set(this,'dataObj',result);
            }
        })
    }
}
created() {
    this.getInfo();
}
}

最重要的js来了,写的有些繁琐,但真的管用,希望各位大佬能够简化一下

export default {
  mergeSetKey(keyList,resultList,mergeList){
    keyList.forEach(item=>{
      this.setKeyLength(resultList,mergeList,item.column,item.name,item.maxName);
    })
  },
  setKeyLength(resultList,mergeList,column,name,maxName){
    let beforeName = '';
    let beforeMaxName = '';
    let nowName = '';
    let nowMaxName = '';
    resultList.forEach((item,index)=>{
      if(index==0){
        beforeName = item[name]?item[name]:'';
        beforeMaxName = item[maxName]?item[maxName]:'';
      }
      nowName = item[name]?item[name]:'';
      nowMaxName = item[maxName]?item[maxName]:'';
      if((beforeMaxName !== nowMaxName || beforeName !== nowName) && index!=0){
        let keySum = 0;
        mergeList.forEach(keyItem=>{
          if(keyItem.column === column){
            keySum = keySum + keyItem.key;
          }
        })
        let temp = {
          column:column,
          rowIndex:keySum,
          key:index-keySum
        }
        mergeList.push(temp);
        beforeName = nowName;
        beforeMaxName = nowMaxName;
      }
      if(++index == resultList.length){
        let keySum = 0
        mergeList.forEach(keyItem=>{
          if(keyItem.column === column){
            keySum = keySum + keyItem.key;
          }
        })
        let temp = {
          column:column,
          rowIndex:keySum,
          key:index-keySum
        }
        mergeList.push(temp);
      }
    })
  },
  objectSpanMethod(row,rowIndex,columnIndex,keyList,mergeList) {
    let flag = false;
    keyList.forEach(item=>{
      if(columnIndex === item.column){
        flag = true;
      }
    })
    if(flag){
      let key = 0
      for(let i=0;i<mergeList.length;i++){
        if(mergeList[i].column===columnIndex && mergeList[i].rowIndex===rowIndex){
          key = mergeList[i].key;
          break;
        }
      }
      if(key!=0){
        return {
          rowspan: key,
          colspan: 1
        };
      }else{
        return {
          rowspan: 0,
          colspan: 0
        };
      }
    }else{
      return {
        rowspan: 1,
        colspan: 1
      };
    }
  },
}

最后说明一点,千万不要在其中加console.log()会非常慢。因为计算量太大,合并列或行都不适用非常庞大的主列表。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值