写了半天,写个记录 方便后续碰到了使用。
/**
* 根据 表信息 与 要合并的 字段信息 计算要合并的信息 用于 合并
* @param {*} list 表信息
* @param {*} mergeFields 要合并的字段信息
* @param {*} mainField 依据 什么进行的 单元格合并 不传 就 自然合并
* @returns 计算 合并的结果
*/
export function recordMergeInfo(list, mergeFields, mainField) {
const mergeObj = {};
mergeFields.forEach((key) => {
let count = 0; // 用来记录需要合并行的起始位置
mergeObj[key] = []; // 记录每一列的合并信息
list.forEach((item, index) => {
// index == 0表示数据为第一行,直接 push 一个 1
if (index === 0) {
mergeObj[key].push(1);
// debug 用 不用注掉
// if (mainField) {
// mergeObj[`main-${mainField}`] = item[mainField]
// }
} else {
// 判断当前行是否与上一行其值相等 如果相等 在 count 记录的位置其值 +1 表示当前行需要合并 并push 一个 0 作为占位
if (item[key] === list[index - 1][key] &&( !mainField || item[mainField]=== list[index - 1][mainField])) {
mergeObj[key][count] += 1;
mergeObj[key].push(0);
} else {
// 如果当前行和上一行其值不相等
count = index; // 记录当前位置
mergeObj[key].push(1); // 重新push 一个 1
}
}
});
});
return mergeObj;
}
const crtMergeTableFields = [
"class",
...
];
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
// 调用这个之前 一定要先 将得到的列表数据 计算出来 mergeObj 数据
if (crtMergeTableFields.includes(column.property)) {
// 判断其值是不是为0
if (this.mergeObj?.[column.property][rowIndex]) {
return [this.mergeObj[column.property][rowIndex], 1];
} else {
// 如果为0则为需要合并的行
return [0, 0];
}
}
},
// 获取数据后
this.mergeObj = recordMergeInfo(
this.tableData,
crtMergeTableFields,
"classId"
);
<el-table
v-loading="loading"
:data="tableData"
:span-method="objectSpanMethod"
style="width: 100%; margin-bottom: 20px"
row-key="id"
border
>
...
</el-table>
- 单元 上下 element table UI单元 上下element table table scope element-ui slot-scope show-summary element-ui el-table element 局部element-ui表格el-table element-ui表格 单元element togglerowselection element-ui el-table element element-ui element功能table 视频直播element-ui源码el-table element-ui classname单元element element数据table ui