最近做的項目涉及到很多單元格合並問題,element-ui組件對於單元格合並的處理雖然很靈活,但是需要事先計算好每個單元格合並的rowspan和colspan,直接在span-method屬性中計算實現起來有點困難,所以我拿到列表后先把每條數據的需要合並的rowspan計算出來然后直接在span-method屬性中返回即可。上代碼:
export const merge = function(
colArr,
list
) {
var allProps = [];
colArr.forEach((props, index) => {
allProps.push(...props);
list = getLevel(props, allProps, list);
});
return list;
};
//組裝層
function getLevel(props, allProps, list) {
var rowKey = {};
for (var item of list) {
let propInfo = getPropStr(allProps, item);
if (rowKey[propInfo.key]) {
rowKey[propInfo.key].children.push(item);
} else {
let obj = propInfo;
obj.children = [item];
rowKey[propInfo.key] = obj;
}
}
let info = [];
for (var key in rowKey) {
rowKey[key].children.forEach((item, index) => {
if (index == 0) {
item = Object.assign(
item,
getMergeInfo(props, rowKey[key].children.length)
);
} else {
item = Object.assign(item, getMergeInfo(props, 0));
}
info.push(item);
});
}
return info;
}
//獲取合並信息
function getMergeInfo(props, num) {
let obj = {};
props.forEach(item => {
obj[item + "_merge"] = {
rowspan: num,
colspan: 1
};
});
return obj;
}
// 把屬性的值拼接在一起,並和屬性的值一起返回。
function getPropStr(props, info) {
let obj = {};
let propStr = props.map(item => {
obj[item] = info[item];
return info[item];
});
obj.key = propStr.toString();
return obj;
}
span-method合並函數:
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (row[column.property + "_merge"]) {
return row[column.property + "_merge"];
} else {
return { rowspan: 1, colspan: 1 };
}
},
導進去直接調用:
var colArr = [["id", "grade"], ["class"]];
var list = [
{ id: 1, grade: 1, class: 1, name: "張三" },
{ id: 1, grade: 1, class: 1, name: "李四" },
{ id: 1, grade: 1, class: 2, name: "王五" },
{ id: 1, grade: 1, class: 2, name: "找六" },
{ id: 2, grade: 2, class: 7, name: "張三_1" },
{ id: 2, grade: 2, class: 7, name: "李四_1" },
{ id: 2, grade: 2, class: 3, name: "王五_1" },
{ id: 2, grade: 2, class: 3, name: "找六_1" }
];
this.tableDate = merge(colArr, list);

備注:colArr是要合並的層級。示例中id和grade是第一次,class是第二層。
list是數據列表。
