错位展示:
多个同时展开:
最终结果:
解决思路:展开行,在dom上其实是新增了一行的高度,合并上新增一个高度就可以
具体如下:
1、:首先添加@expand-change 展开/收起事件
2、在data中添加一个用来存储展开、收起的数据变量
data() {
return {
expandeList: []
};
},
3、通过:span-method="spanMethod"和 @expand-change=“expandChange” 进行处理。
expandChange(row, expandedRows) {
this.expandeList = expandedRows.map(item => item.teamName) //teamName为第一列合并单元格的配置,也是上图中的标注名称字段
},
spanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0) {
//tableData 是表格的data数据
if (rowIndex === 0 || row.teamName !== this.tableData[rowIndex - 1].teamName) {
//不展开数据时,需要合并第一列。
let rowspan = 1;
for (let i = rowIndex + 1; i < this.tableData.length; i++) {
if (row.teamName === this.tableData[i].teamName) {
rowspan++;
} else {
break;
}
}
//针对展开后,错位处理,是由于每展开一次就会多出一行,同时不确定有多少数据
const sameTeamNameLength = this.getArrItemNum(this.expandeList)
return { rowspan: sameTeamNameLength.get(row.teamName)?sameTeamNameLength.get(row.teamName) + rowspan : rowspan, colspan: 1 };
} else {
return { rowspan: 0, colspan: 0 };
}
}
},
//统计 同时展开多条行,相同标注名称出现的次数
getArrItemNum(arr) {
let mapObj = new Map();
arr.forEach(element => {
let num = mapObj.get(element);
if (num) {
mapObj.set(element, ++num);
} else {
mapObj.set(element, 1);
}
});
return mapObj;
},