element-ui table 根据字段相同值合并单元格

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

<script>
export default {
  name: 'StockIndex',
  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: '王小虎1',
        amount1: '324',
        amount2: '1.9',
        amount3: 9
      }, {
        id: '12987125',
        name: '王小虎2',
        amount1: '621',
        amount2: '2.2',
        amount3: 17
      }, {
        id: '12987126',
        name: '王小虎2',
        amount1: '539',
        amount2: '4.1',
        amount3: 15
      }]
    }
  },
  methods: {
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      const that = this
      let spanArr = []
      let spanScendArr = []
      let pos = 0
      const data = this.tableData
      data.forEach((item, index) => {
        if (index === 0) {
          spanArr.push(1)
          spanScendArr.push(1)
          pos = 0
        } else {
          if (data[index].name === data[index - 1].name) {
            spanArr[this.pos] += 1
            spanArr.push(0)
          } else {
            spanArr.push(1)
            spanScendArr.push(1)
            pos = index
          }
        }
      })
      if (columnIndex === 0) {
        const _row = spanArr[rowIndex]
        const _col = _row > 0 ? 1 : 0
        return {
          rowspan: _row,
          colspan: _col
        }
      } else {
        return false
      }
    }
  }
}
</script>

<style lang="scss" scoped>
.app-container {
  background-color: #fff;
}
</style>