element UI 表格的行合并方法

<template>
  <div class="home">
    <template>
      <el-table :data="tableData" style="width: 100%" :span-method="arraySpanMethod">
        <el-table-column v-for="(item,index) in columnList" :prop="item.prop" :label="item.label" align="center">
        </el-table-column>
      </el-table>
    </template>
  </div>
</template>
<script>
export default {
  name: 'Home',
  components: {},
  data() {
    return {
      tableData: [
        { city: '蘇州', country: '玄武', gender: '男', name: '1' },
        { city: '南京', country: '江寧', gender: '男', name: '2' },
        { city: '南京', country: '江寧', gender: '女', name: '3' },
        { city: '南京', country: '江寧', gender: '男', name: '4' },
        { city: '南京', country: '鼓樓', gender: '男', name: '5' },
        { city: '南京', country: '鼓樓', gender: '男', name: '6' },
        { city: '南京', country: '秦淮', gender: '男', name: '7' },
        { city: '南京', country: '秦淮', gender: '女', name: '8' },
        { city: '南京', country: '建鄴', gender: '男', name: '9' },
        { city: '南京', country: '建鄴', gender: '男', name: '0' },
        { city: '鹽城', country: '建鄴', gender: '男', name: '2' },
        { city: '鹽城', country: '建鄴', gender: '女', name: '2' },
        { city: '徐州', country: '建鄴', gender: '女', name: '3' },
        { city: '連云港', country: '新浦', gender: '女', name: 'aaa' },
        { city: '連云港', country: '新浦', gender: '男', name: 'aaa' },
        { city: '連云港', country: '新浦', gender: '女', name: 'bbb' },
        { city: '連云港', country: '新浦', gender: '男', name: 'ccd' },
        { city: '連云港', country: '海州', gender: '男', name: 'eee' },
        { city: '連云港', country: '海州', gender: '男', name: 'ccc' },
        { city: '連云港', country: '連云', gender: '女', name: 'aaa' },
        { city: '連云港', country: '贛榆', gender: '男', name: 'aaa' },
        { city: '連云港', country: '贛榆', gender: '男', name: 'aaa' },
        { city: '連云港', country: '贛榆', gender: '女', name: 'aaa' },
      ],
      columnList: [{
        prop: 'city',
        label: '城市'
      }, {
        prop: 'country',
        label: '區(qū)縣'
      }, {
        prop: 'gender',
        label: '性別'
      }, {
        prop: 'name',
        label: '姓名'
      }],
      mergeKey: [0, 1, 2],
      mergeObj: [],
      margeStartLine: [],
      n: 0
    }
  },
  created() {
    this.mergeObj = this.getMergeObj(this.tableData, 'city')
  },
  mounted() {
    this.getMergeObj(this.tableData, 'city')
  },
  methods: {
    getMergeObj(data, key, keyIndex) {
      // startIndex, range
      let curIndex = 0
      let arr = []
      let margeStartLine = []
      for (let i = 0; i < data.length; i++) {
        arr.push(0)
        if (i == 0) {
          curIndex = 0
          margeStartLine.push(0)
        } else {
          let canMerge = false
          let count = 0
          for (let k = 0; k <= keyIndex; k++) {
            let curKey = this.columnList[k].prop
            if (data[i][curKey] == data[i - 1][curKey]) {
              count++
            }
          }
          if (count == keyIndex + 1) {
            arr[curIndex] += 1
            if (curIndex != margeStartLine[margeStartLine.length - 1]) {
              margeStartLine.push(curIndex)
            }
          } else {
            margeStartLine.push(i)
            curIndex = i
          }
        }
      }
      return {
        mergeArr: arr,
        margeStartLine: margeStartLine
      }
    },

    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
      for (let k = 0; k < this.mergeKey.length; k++) {
        let key = this.columnList[this.mergeKey[k]]
        if (columnIndex === this.mergeKey[k]) {
          let key = this.columnList[columnIndex].prop
          let obj = this.getMergeObj(this.tableData, key, columnIndex)
          
          let mergeArr = obj.mergeArr
          let margeStartLine = obj.margeStartLine

          if (margeStartLine.indexOf(rowIndex) > -1) {
            let index = margeStartLine[margeStartLine.indexOf(rowIndex)]
            return {
              rowspan: mergeArr[index] + 1,
              colspan: 1
            };
          } else {
            return {
              rowspan: 0,
              colspan: 0
            };
          }

        }
      }
      if (this.mergeKey.indexOf(this.columnList[columnIndex].prop) > -1) {
        let key = this.columnList[columnIndex].prop
        // let { mergeObj, margeStartLine } = this.getMergeObj(this.tableData, key)
        if (margeStartLine.indexOf(rowIndex) > -1) {
          let index = margeStartLine[margeStartLine.indexOf(rowIndex)]
          return {
            rowspan: mergeObj[index] + 1,
            colspan: 1
          };
        } else {
          return {
            rowspan: 0,
            colspan: 0
          };
        }
      }
    }
  }
}

</script>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容