element合并树状表格

需求:element合并树状表格,相同区域id合并,展开还有下一级

返回数据结构

[{id:'0',name:'项目',children:[
{id:'1',name:'项目1'children:[……]},
{id:'2',name:'项目2',code:'5'
children:[{id:'23',name:'项目2.1',code:'4'}]}
{id:'2',name:'项目2',code:'2'},
{id:'2',name:'项目3',code:'2'}]}]

为了让项目2合并并能展开,项目2的下一级children应放在最后一条合并的单元格下面

{id:'2',name:'项目2',code:'5'}
{id:'2',name:'项目2',code:'2',children:[{id:'23',name:'项目2.1',code:'4'}]},//children放在这里
{id:'2',name:'项目3',code:'2'}

处理

  getData(data) {
      for (let i in data) {
        let j = Number(i) + 1;
        if (data[j]) {
          if (data[i].children && data[i].children.length) {
            if (data[i].name== data[j].name) {//判断name是否相同
              let arr = JSON.parse(JSON.stringify(data[i]));
              let arr2 = JSON.parse(JSON.stringify(data[j]));
              data[i] = arr2;
              data[i].hasChild = true; //用于展开标识,合并数组的第一个可以展开
              data[j] = arr;//交换位置
            }
            this.getData(data[i].children);
          }
        }
      }
      return data;
    },

表格合并方法

 /** 合并方法 */
    SpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        let _row = this.spanArr[rowIndex] ? this.spanArr[rowIndex] : 0;
        return {
          rowspan: _row,
          colspan: 1,
        };
      }
    },
//spanArr合并数组
 /** 合并列数的方法 */
    setdates(arr) {
      this.spanArr = [];
      var obj = {},
        k;
      for (var i = 0, len = arr.length; i < len; i++) {
        k = arr[i].name;
        if (obj[k]) obj[k]++;
        else obj[k] = 1;
      }
      //保存结果{el-'元素',count-出现次数}
      for (var o in obj) {
        if (o == "undefined") {
          this.spanArr.push(0); // 0代表不合并
        } else {
          for (let i = 0; i < obj[o]; i++) {
            if (i === 0) {
              this.spanArr.push(obj[o]);
            } else {
              this.spanArr.push(0); // 0代表不合并
            }
          }
        }
      }
    },
   //arr获取,data为原始数组,遍历转成一维数组
     setArr(data, arr) {
      data.forEach((item, index) => {
        arr.push(item);
        if (item.children) {
          this.setArr(item.children, arr);
        }
      });
      return arr;
    },

在template里单独设置第一列样式

       <el-table-column label="区域" key="name" prop="name" show-overflow-tooltip>
            <template v-slot="{ row }"><div v-if="row.hasChild" style="text-align: left; padding-left: 10px" >
            <span  v-if="row.hasChild"  class="arrow-icon" @click="toggleRowExpansion(row)" >//加一个自带的切换方法,否则不能展开
         <i :class="row.isExpand ? 'el-icon-arrow-down': 'el-icon-arrow-right' "/> </span>
             <span>{{ row.name }}</span> </div>
             <span v-else>{{ row.name }}</span></template>
          </el-table-column>

自带表格切换/展开方法

  toggleRowExpansion(row) {
      row.isExpand = !row.isExpand;
      let rowList = this.getRowList(row, this.tableData);
      const expansionRow = rowList[rowList.length - 1];
      this.$refs.detailTable &&
        this.$refs.detailTable.toggleRowExpansion(expansionRow, row.isExpand);
    },
    // 获取点击层级同编码name所有数据数组
    getRowList(row, list) {
      for (let i = 0; i < list.length; i++) {
        if (list[i].id === row.id)
          return list.filter(
            (item) => item.name === row.name
          );
        if (list[i].children && list[i].children.length) {
          let res = this.getRowList(row, list[i].children);
          if (res) return res;
        }
      }
      return false;
    },

需要多加一些处理,确实有点麻烦,希望有更方便可以直接实现的组件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值