Element 表格合并 + 树形

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

树形展开按钮放到第二列,设置第一列type为空即可
代码如下:

<el-table-column prop="SORT_" align="center" label="测试" type=""></el-table-column>

根据重复字段,合并表格

数据格式如下
在这里插入图片描述
代码如下

<el-table
      :data="tableData"
      :span-method="objectSpanMethod"
      row-key="SORT_ID" 
      @expand-change="expandChange"
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
      border
      style="width: 100%">
      <el-table-column
        prop="id"
        label="ID"
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名">
      </el-table-column>
      <el-table-column
        prop="amount1"
        sortable
        label="数值 1">
      </el-table-column>
      <el-table-column
        prop="amount2"
        sortable
        label="数值 2">
      </el-table-column>
      <el-table-column
        prop="amount3"
        sortable
        label="数值 3">
      </el-table-column>
    </el-table>
/**
     * 处理表格数据合并行
     */
        dealTableData() {
            //把日期相同的数据并排在一块
            const list = this.margePropData(this.tableData, 'SORT_')
            //处理日期相同的合并
            this.tableData = this.mergeRows(list, 'SORT_')
        },
        objectSpanMethod({ row, column, rowIndex, columnIndex }) {

            if ([0].includes(columnIndex) && row.SORT_ != 99) {
                return {
                    rowspan: row.rowspan,
                    colspan: 1
                };
            }
            if (row.SORT_ == 99) {
                if (columnIndex === 0) {
                    return [0, 0]
                } else if (columnIndex === 1) {
                    return [1, 2]
                }
            }
        },
        margePropData(list = [], prop) {
            let arr = [], tempArr = {};
            list.forEach(item => {
                if (!tempArr[item[prop]]) {
                    tempArr[item[prop]] = [item]
                } else {
                    tempArr[item[prop]].push(item)
                }
            })
            for (const tempArrKey in tempArr) {
                arr = [...arr, ...tempArr[tempArrKey]]
            }
            return arr
        },
        mergeRows(list = [], prop) {
            list.forEach(ele => {
                ele.rowspan = 1
            })
            const len = list.length
            for (let i = 0; i < len; i++) {
                for (let j = i + 1; j < len; j++) {
                    if (list[i][prop] === list[j][prop]) {
                        list[i].rowspan++
                        list[j].rowspan--
                    }
                }
                // 这里跳过已经重复的数据
                i = i + list[i].rowspan - 1
            }
            return list
        },
        // 点击树形展开按钮的回调事件,重新改变表格数据,自动计算合并行
        expandChange(row, expanded) {
            var index = 0
            if (row.SORT_ == 1) {
                index = 0
            }
            if (row.SORT_ == 2) {
                index = 4
            }
            if (row.SORT_ == 3) {
                index = 8
            }
            // 拿到当前行的children的length,增加或者减少当前合并行的数目即可
            if (expanded) {
                this.oldrowspan = this.tableData[index].rowspan
                this.$set(this.tableData[index], 'rowspan', this.tableData[index].rowspan + row.children.length)
            } else {
                this.$set(this.tableData[index], 'rowspan', this.tableData[index].rowspan - row.children.length)
            }
        },
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值