<template>
<el-table
:data="formattedList"
:span-method="handleColspanMethod"
>
...
</el-table>
</template>
<script>
import Api from '@/api/assign'
export default {
data() {
return {
list: [], // 后台返回的数据
formattedList:[], // 格式化后的数据
spanArr: [], // 保存要合并的行列数据
}
},
created() {
this.getList()
},
methods: {
getList() {
Api.fetchList().then(response => {
this.list = response.data.data
// 格式化数据
this.formattedList = this.formatArray(this.list)
// 获取合并位置
this.getSpanArr()
})
},
/**
* 格式化数组
* {Array} sources 源数组
* {Array} arrayed 格式化后的数组
* return 返回格式化后的数组
*/
formatArray: function f(sources, arrayed) {
if (!sources) return []
const arr = arrayed || []
const len = sources.length
for (let i = 0; i < len; i++) {
const children = sources[i].list || []
arr.push(sources[i])
if (children.length > 0) {
f(sources[i].list, arr)
}
}
return arr
},
/**
* 获取合并位置信息
*/
getSpanArr() {
// 重置 spanArr,因为翻页的时候数据就变了
// 之前的数据如果不清空,其他页也会受影响
this.spanArr = []
const data = this.formattedList
if (!data || data.length <= 0) return
// 遍历
for (let i = 0; i < data.length; i++) {
if (i === 0) {
this.spanArr.push(1)
// 其实就是行索引
this.pos = 0
} else {
// 如果当前对象和上一个对象的 appKey 相等
// 说明需要合并
if (data[i].appKey === data[i - 1].appKey) {
this.spanArr[this.pos] += 1
this.spanArr.push(0)
} else {
this.spanArr.push(1)
this.pos = i
}
}
}
},
/**
* 处理跨行列合并
*/
handleColspanMethod({ row, column, rowIndex, columnIndex}) {
if (columnIndex < 2) {
const _spa = this.spanArr[rowIndex]
const _row = _spa ? _spa : 0
const _col = _row > 0 ? 1 : 0
return {
rowspan: _row,
colspan: _col
}
}
}
}
}
</script>