Element-ui中列合并

本文详细介绍如何在Element UI的表格组件中实现数据的合并显示,通过实例代码演示了使用span-method属性进行列和行的合并操作,适用于需要对重复数据进行合并展示的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官网实例如下:

<template>
  <div>
    <el-table
      :data="tableData"
      :span-method="arraySpanMethod"
      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>

    <el-table
      :data="tableData"
      :span-method="objectSpanMethod"
      border
      style="width: 100%; margin-top: 20px">
      <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"
        label="数值 1(元)">
      </el-table-column>
      <el-table-column
        prop="amount2"
        label="数值 2(元)">
      </el-table-column>
      <el-table-column
        prop="amount3"
        label="数值 3(元)">
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        tableData: [{
          id: '12987122',
          name: '王小虎',
          amount1: '234',
          amount2: '3.2',
          amount3: 10
        }, {
          id: '12987123',
          name: '王小虎',
          amount1: '165',
          amount2: '4.43',
          amount3: 12
        }, {
          id: '12987124',
          name: '王小虎',
          amount1: '324',
          amount2: '1.9',
          amount3: 9
        }, {
          id: '12987125',
          name: '王小虎',
          amount1: '621',
          amount2: '2.2',
          amount3: 17
        }, {
          id: '12987126',
          name: '王小虎',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }]
      };
    },
    methods: {
      arraySpanMethod({ row, column, rowIndex, columnIndex }) {
        if (rowIndex % 2 === 0) {
          if (columnIndex === 0) {
            return [1, 2];
          } else if (columnIndex === 1) {
            return [0, 0];
          }
        }
      },

      objectSpanMethod({ row, column, rowIndex, columnIndex }) {
        if (columnIndex === 0) {
          if (rowIndex % 2 === 0) {
            return {
              rowspan: 2,
              colspan: 1
            };
          } else {
            return {
              rowspan: 0,
              colspan: 0
            };
          }
        }
      }
    }
  };
</script>

实际上重点在于每一行需要合并列的位置以及往下合并的行数.需要把这个信息放入行内

 

<template>
  <div>
    <el-table
      :data="newTableData"
      :span-method="objectSpanMethod"
      border
      style="width: 100%; margin-top: 20px">
      <el-table-column
        prop="name"
        label="姓名">
      </el-table-column>
      <el-table-column
        prop="amount1"
        label="数值 1(元)">
      </el-table-column>
      <el-table-column
        prop="amount2"
        label="数值 2(元)">
      </el-table-column>
      <el-table-column
        prop="amount3"
        label="数值 3(元)">
      </el-table-column>
    </el-table>
  </div>
</template>


<script>
  export default {

    data() {
      return {
        gruopRow:[],
        newTableData : [],
        tableData: [{
          id: '12987122',
          name: '王小虎',
          amount1: '234',
          amount2: '3.2',
          amount3: 10
        }, {
          id: '12987122',
          name: '王小虎',
          amount1: '165',
          amount2: '4.43',
          amount3: 12
        }, {
          id: '12987123',
          name: '李小蛇',
          amount1: '324',
          amount2: '1.9',
          amount3: 9
        }, {
          id: '12987123',
          name: '李小蛇',
          amount1: '621',
          amount2: '2.2',
          amount3: 17
        }, {
          id: '12987124',
          name: '张小鸟',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        },{
          id: '12987124',
          name: '张小鸟',
          amount1: '234',
          amount2: '3.2',
          amount3: 10
        }, {
          id: '12987124',
          name: '张小鸟',
          amount1: '165',
          amount2: '4.43',
          amount3: 12
        }, {
          id: '12987125',
          name: '钱小猴',
          amount1: '324',
          amount2: '1.9',
          amount3: 9
        }, {
          id: '12987125',
          name: '钱小猴',
          amount1: '621',
          amount2: '2.2',
          amount3: 17
        }, {
          id: '12987125',
          name: '钱小猴',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }]
      };
    },
  mounted: function () {
      this.dataHandler();
     },
    methods: {
      dataHandler(){
        //重复计算
         for (let i  in this.tableData) {
           //初始化需要合并的行数和列数量
          this.$set(this.tableData[i], "row", 0);
          this.$set(this.tableData[i], "column", 0);
           //过滤重复数据以及计算重复数量(得出需要往下合并行数)
          let r = this.contains(this.gruopRow, this.tableData[i])
          //如果重复数据则不修改合并数,保持为0,如果不重复为该类型第一行则加入数组
          if (!r) {
             this.gruopRow.push({'name': this.tableData[i].name, "num": 1})
             this.tableData[i].row = 1;
             this.tableData[i].column = 1;
           }
        }
        //合并计算
         for (let i  in this.tableData) {
                for (let j = 0; j < this.gruopRow.length; j++) {
                  //如果该行为本类型第一行,则赋值
                  if (this.gruopRow[j].name == this.tableData[i].name) {
                    let num = this.gruopRow[j].num
                    this.tableData[i].row = num;
                    this.tableData[i].column = 1;
                    this.gruopRow.splice(j, 1);
                  }
                }
              }
         this.newTableData = this.tableData
      },
     contains(arr, obj) {
        let i = arr.length;
        while (i--) {
          if (arr[i].name === obj.name) {
            arr[i].num = arr[i].num + 1;
             return true;
          }
        }
        return false;
      },
      objectSpanMethod({ row, column, rowIndex, columnIndex }) {
        //判断是否为第一列
        if (columnIndex === 0) {
           return {
            rowspan: row.row,
            colspan: row.column
          }
        }
      }
    }
  };
</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值