合并多列,后面一列需要根据前面一列在基本上再合并处理
合并效果
代码:
//组件
:span-method="mergeRowMethod"
//js 部分
// 合并数据处理
const fields = ['buyNo', 'flag'] //需要合并的列数据字段
// 通用行合并函数(将相同多列数据合并为一行)
const mergeRowMethod: VxeTablePropTypes.SpanMethod = ({ row, _rowIndex, column, visibleData }) => {
if (fields.length == 0) {
return;
}
const cellValue = row[column.field];
if (
cellValue != undefined &&
cellValue != null &&
fields.includes(column.field)
) {
const prevRow = visibleData[_rowIndex - 1];
let nextRow = visibleData[_rowIndex + 1];
//if (prevRow && prevRow[column.property] === cellValue) {
if (prevRow && checkMergeFields(row, prevRow, column.field)) {
return { rowspan: 0, colspan: 0 };
} else {
let countRowspan = 1;
//while (nextRow && nextRow[column.property] === cellValue) {
while (nextRow && checkMergeFields(row, nextRow, column.field)) {
nextRow = visibleData[++countRowspan + _rowIndex];
}
if (countRowspan > 1) {
return { rowspan: countRowspan, colspan: 1 };
}
}
}
}
//循环判断前面的列,如果值不一样的话就不合并
function checkMergeFields(row, nextRow, property) {
var ret = true;
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
if (nextRow[field] != row[field]) {
ret = false;
break;
}
if (field == property) {
break;
}
}
return ret;
}