element UI 合并table上下单元格
写了半天,写个记录 方便后续碰到了使用。
/**
* 根据 表信息 与 要合并的 字段信息 计算要合并的信息 用于 合并
* @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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2021-05-08 处理webflux 项目 增加 content-path