table
<!-- 表格标签 边框 宽 高 水平的对齐方式left|center|right 单元格与内容之间的距离 单元格与单元格之间的距离 -->
<table border="1" width="500" height="200" align="left" cellpadding="10" cellspacing="0">
<caption>表格标题</caption>
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
<tr>
<td>Tom</td>
<td rowspan="2">18</td>
</tr>
<tr>
<td>Jerry</td>
</tr>
<tr>
<td colspan="2">other</td>
</tr>
</table>
el-table
1. 固定合并span-method
<el-table
:span-method="objectSpanMethod"
...
>
...
</el-table>
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
if (columnIndex <= 3) {
if (rowIndex % 2 === 0) {
return {
rowspan: 2,
colspan: 1,
};
} else {
return {
rowspan: 0,
colspan: 0,
};
}
}
}
2. 动态合并
2.1 无序号
<el-table
:data="tableData"
:span-method="objectSpanMethod"
>
<el-table-column
prop="grade"
label="年级"
/>
<el-table-column
prop="class"
label="班级"
/>
<el-table-column
prop="name"
label="姓名"
/>
</el-table>
const tableData = ref([]);
const colFields = ref(['grade', 'class']);
const spanArr = ref({});
const getSpanArr = (data, arr) => {
arr.forEach((key) => {
let row = 0;
spanArr.value[key] = [];
data.forEach((item, index) => {
if (index === 0) {
spanArr.value[key].push(1);
} else {
if (
item[key] === data[index - 1][key] &&
item.grade === data[index - 1].grade
) {
spanArr.value[key][row] += 1;
spanArr.value[key].push(0);
} else {
row = index;
spanArr.value[key].push(1);
}
}
});
});
};
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
if (colFields.value.indexOf(column.property) !== -1) {
if (spanArr.value[column.property][rowIndex]) {
return [spanArr.value[column.property][rowIndex], 1];
} else {
return [0, 0];
}
}
};
onMounted(() => getSpanArr(tableData.value, colFields.value));
2.2 有序号,前端添加index实现
<el-table
:data="tableData"
:span-method="objectSpanMethod"
>
<el-table-column
type="index"
:index="indexMethod"
label="序号"
/>
<el-table-column
prop="province"
label="省份"
/>
<el-table-column
prop="area"
label="地区"
/>
<el-table-column
prop="weather"
label="天气"
/>
</el-table>
const tableData = ref([
{ province: 'zj', area: 'nb', weather: 'rainy' },
{ province: 'zj', area: 'hz', weather: 'sunny' },
{ province: 'js', area: 'nj', weather: 'windy' },
]);
const colFields = ref(['province']);
const spanArr = ref({});
const indexNum = ref([]);
const getSpanArr = (data, arr) => {
arr.forEach((key) => {
let row = 0;
spanArr.value[key] = [];
data.forEach((item, index) => {
spanArr.value[key][index] = [1, 1];
if (index === 0) {} else {
if (item[key] === data[index - 1][key]) {
spanArr.value[key][row][0] += 1;
spanArr.value[key][index][0] = 0;
} else {
row = index;
}
}
});
});
let num = 0;
spanArr.value[arr[0]].map((item, index) => {
if (item[0] != 0) {
indexNum.value[index] = num += 1;
}
});
};
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
if (colFields.value.indexOf(column.property) !== -1) {
if (spanArr.value[column.property].length) {
return spanArr.value[column.property][rowIndex];
}
} else if (columnIndex === 0 && spanArr.value[colFields.value[0]]) {
return spanArr.value[colFields.value[0]][rowIndex];
}
};
const indexMethod = (index) => {
return indexNum.value[index];
};
onMounted(() => getSpanArr(tableData.value, colFields.value));
2.3 有序号,后端返回字段number实现
<el-table
:data="tableData"
:span-method="objectSpanMethod"
>
<el-table-column
prop="number"
label="序号"
/>
<el-table-column
prop="province"
label="省份"
/>
<el-table-column
prop="area"
label="地区"
/>
<el-table-column
prop="weather"
label="天气"
/>
</el-table>
const tableData = ref([
{ number: 1, province: 'zj', area: 'nb', weather: 'rainy' },
{ number: 1, province: 'zj', area: 'hz', weather: 'sunny' },
{ number: 2, province: 'js', area: 'nj', weather: 'windy' },
]);
const colFields = ref(['number', 'province']);
const spanArr = ref({});
const getSpanArr = (data, arr) => {
arr.forEach((key) => {
let row = 0;
spanArr.value[key] = [];
data.forEach((item, index) => {
if (index === 0) {
spanArr.value[key].push(1);
} else {
if (item[key] === data[index - 1][key]) {
spanArr.value[key][row] += 1;
spanArr.value[key].push(0);
} else {
row = index;
spanArr.value[key].push(1);
}
}
});
});
};
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
if (colFields.value.indexOf(column.property) !== -1) {
if (spanArr.value[column.property][rowIndex]) {
return [spanArr.value[column.property][rowIndex], 1];
} else {
return [0, 0];
}
}
};
onMounted(() => getSpanArr(tableData.value, colFields.value));
2.3 排序问题,合并单元格是当前单元格数据与上一行比较,当表格无序时合并会有问题
const tableData = ref([
{ province: 'zj', area: 'nb' },
{ province: 'js', area: 'nj' },
{ province: 'zj', area: 'hz' },
{ province: 'ah', area: 'hf' },
]);
const getSortArr = (data, sortAttr) => {
const sortArr = data.reduce((acc, curr) => {
const existingArr = acc.find((i) => i[0][sortAttr] === curr[sortAttr]);
if (existingArr) {
existingArr.push(curr);
} else {
acc.push([curr]);
}
return acc;
}, []);
return sortArr.flat();
}
onMounted(() => tableData.value = getSortArr(tableData.value, 'province'));