需求:
需要将从后台获取的数据,在前端渲染时,如果同一列相邻的数据相同,则合并成一个单元格。
方法1:(缺点同方法2)
后端返回对应的标识,前端只需要根据这些标识做处理。
返回数据
以下面后端返回数据截图为例: 返回mergeNum字段,为4说明要合并4行,为0说明当前是已被合并了的
代码:
<Table id="tab" border :columns="columns1" :data="dataTable" :span-method="handleSpan"></Table>
handleSpan({ row, column, rowIndex, columnIndex }){
if (row.evaluationIndexDetail.mergeNum && columnIndex === 0) { //根据后端返回的字段处理
return {
rowspan: row.evaluationIndexDetail.mergeNum,
colspan: 1
};
} else if (columnIndex === 0) {
return {
rowspan: 0,
colspan: 0
};
}
if(row.evaluationIndexDetail.isFetch == 'Y'){ //直接取值,是固定的,所以就没让后端处理
if (columnIndex === 2) {
return {
rowspan: 1,
colspan: 2
};
} else if (columnIndex === 3) {
return {
rowspan: 0,
colspan: 0
};
}
}
}
效果
![image.png](https://cdn.nlark.com/yuque/0/2020/png/391597/1608108310401-7b4b66c4-f0c8-4339-85c6-54b1f119891d.png#align=left&display=inline&height=467&margin=%5Bobject%20Object%5D&name=image.png&originHeight=467&originWidth=1088&size=81073&status=done&style=none&width=1088)
方法2:(缺点:不是连一起的相同数据多处合并有问题)
因为当前需求是同一列的相同数据就合并,所以在拿到后端的数据后先处理下(其实就是方法1中的标识字段改成由前端处理)
返回数据:
不需要关注返回数据
代码:
assembleData(data){
for(let i=0;i<data.length;i++){
if(data[i].already!==1){
if(data[i+1]){
data[i].num=1
for(var a =i+1 ;a<data.length;a++){
//判断第一个和相邻的第二个数据是否相等
if(data[i].evaluationIndexDetail.contentType === data[a].evaluationIndexDetail.contentType) {
data[i].num++
data[a].num = 0
data[a].already = 1 //加标识,已经处理过的就跳过不再重复处理
}else{
break
}
}
}
}
}
return data
},
效果
同方法1,就不截图了
缺点
不能满足以下需求:
方法3:(解决方法2的缺点)
返回数据:
不需要关注返回数据
代码:
/*合并单元格
data:数据列表
contentType:将要合并的对比字段
*/
getMergeNum (data, contentType){
//页面展示的数据,不一定是全部的数据,所以每次都清空之前存储的 保证遍历的数据是最新的数据。以免造成数据渲染混乱
let spanArr = []
let pos = 0
//遍历数据
data.forEach((item, index) => {
//判断是否是第一项
if (index === 0) {
spanArr.push(1)
pos = 0
} else {
//不是第一项时,就根据标识去存储
if (data[index][contentType] === data[index-1][contentType]) {
// 查找到符合条件的数据时每次要把之前存储的数据+1
spanArr[pos] += 1
spanArr.push(0)
} else {
// 没有符合的数据时,要记住当前的index
spanArr.push(1)
pos = index
}
}
})
console.log(spanArr, pos)
return spanArr
}