左侧表头单元格
效果图:
左侧是表格项,顶部是年份
这种适合在手机等小屏展示表格数据
后段返回的数据格式
0: {key: 2010, year: 2010, aAmount: 946, bAmount: 681, cAmount: 469, …}
1: {key: 2011, year: 2011, aAmount: 543, bAmount: 869, cAmount: 80, …}
2: {key: 2012, year: 2012, aAmount: 442, bAmount: 385, cAmount: 412, …}
3: {key: 2013, year: 2013, aAmount: 847, bAmount: 703, cAmount: 539, …}
....
需要处理一下,将纵向年份的表格数据,改成横向的数据
处理后格式:
0: {title: "销售额 1", key: "aAmount", year0: 946, year1: 543, year2: 442, …}
1: {title: "销售额 2", key: "bAmount", year0: 681, year1: 869, year2: 385, …}
2: {title: "销售额 3", key: "cAmount", year0: 469, year1: 80, year2: 412, …}
3: {title: "销售额 4", key: "dAmount", year0: 13, year1: 86, year2: 408, …}
4: {title: "销售额 5", key: "eAmount", year0: 443, year1: 941, year2: 970, …}
还需要处理一下左侧第一列单元格的样式
完整代码
<template>
<div>
<h3>左侧表头表格</h3>
<a-table
class="container"
:columns="columns"
:data-source="fixedData"
:scroll="{ x: 1200 }"
bordered
>
<template #headerCell="{ record, index, column }">
<template v-if="column.dataIndex === 'title'">
<div class="title">
<div class="left">销售额</div>
<div class="line"></div>
<div class="right">年份</div>
</div>
</template>
</template>
</a-table>
</div>
</template>
<script>
import { ref, onMounted } from "vue";
export default {
setup() {
const fixedData = ref([]);
for (let i = 2010; i < 2023; i += 1) {
fixedData.value.push({
key: i,
year: i,
aAmount: Math.floor(Math.random() * 1000),
bAmount: Math.floor(Math.random() * 1000),
cAmount: Math.floor(Math.random() * 1000),
dAmount: Math.floor(Math.random() * 1000),
eAmount: Math.floor(Math.random() * 1000),
});
}
// 表头样式
const customHeaderCell = () => {
return {
class: "custom-title-row",
};
};
// 单元格样式
const customCell = (column, index) => {
// console.log(column, index);
return {
class: "custom-row",
};
};
const columns = ref([
{
title: "",
dataIndex: "title",
fixed: true,
customCell: customCell,
customHeaderCell: customHeaderCell,
},
]);
const handleData = () => {
const columnsArr = [];
const newTable = [
{ title: "销售额1", key: "aAmount" },
{ title: "销售额2", key: "bAmount" },
{ title: "销售额3", key: "cAmount" },
{ title: "销售额4", key: "dAmount" },
{ title: "销售额5", key: "eAmount" },
];
fixedData.value.forEach((item, i) => {
const obj = {
title: item.year,
dataIndex: `year${i}`,
};
columnsArr.push(obj);
});
newTable.forEach((item) => {
fixedData.value.forEach((sItem, i) => {
item[`year${i}`] = sItem[item.key];
});
});
columns.value = columns.value.concat(columnsArr);
console.log(fixedData.value, newTable);
fixedData.value = newTable;
};
onMounted(() => {
handleData();
});
return {
fixedData,
columns,
};
},
};
</script>
<style lang="less">
.ant-table-thead > tr > .custom-title-row {
padding: 0;
}
.custom-row {
background-color: rgb(156, 236, 26);
}
tr.ant-table-row:hover > td.custom-row {
background-color: rgb(156, 236, 26);
}
/* 表头样式 */
.title {
position: relative;
height: 55px;
.left {
position: absolute;
left: 5px;
bottom: 5px;
}
.right {
position: absolute;
right: 5px;
top: 5px;
}
.line {
position: absolute;
height: 1px;
background: #ddd;
width: 104px;
transform: rotate(33deg);
top: 27px;
left: -10px;
}
}
</style>

浙公网安备 33010602011771号