效果图展示
![在这里插入图片描述](/image/aHR0cHM6Ly9pbWctYmxvZy5jc2RuaW1nLmNuL2Q1ZTczZmI1ZmNlYzQ3MzlhNzgwNDAyYzExMDRmZDNmLnBuZw%3D%3D)
思路流程
- 后端返回数据二次处理
- 根据后端数据生成动态表头
- 利用antd 的 customRender 与 rowSpan 设置行合并
完整代码部分
<template>
<div class="bg">
<a-table
bordered
:columns="columns"
:pagination="false"
:dataSource="dataSource"
:row-key="(record) => record.id"
></a-table>
</div>
</template>
<script>
import { GetQualifiedDayData } from '@/services/LIMSApis/qualified'
export default {
name: 'index',
data() {
return {
columns: [],
saveColumnsNode: [
{
title: '质量点名称',
dataIndex: 'pointName',
align: 'center',
width: 150,
customRender: (value, row, index) =>
this.columnsInit(value, row, index, 3),
},
{
title: '控制范围',
dataIndex: 'limitRange',
align: 'center',
width: 100,
customRender: (value, row, index) =>
this.columnsInit(value, row, index, 3),
},
{
title: '属性',
dataIndex: 'attr',
align: 'center',
width: 120,
},
],
dataSource: [],
}
},
mounted() {
this.initTable()
},
methods: {
async initTable() {
let data = {
data: [
{
pointName: '名称1',
limitRange: '<10',
datas: [
{ date: '1月', valueMax: 100, valueMin: 5, numTotal: 30 },
{ date: '2月', valueMax: 120, valueMin: 15, numTotal: 60 },
{ date: '3月', valueMax: 70, valueMin: 4, numTotal: 50 },
{ date: '4月', valueMax: 60, valueMin: 15, numTotal: 40 },
{ date: '5月', valueMax: 200, valueMin: 2, numTotal: 70 },
{ date: '6月', valueMax: 150, valueMin: 7, numTotal: 90 },
],
},
{
pointName: '名称2',
limitRange: '<12',
datas: [
{ date: '1月', valueMax: 53, valueMin: 1, numTotal: 55 },
{ date: '2月', valueMax: 86, valueMin: 2, numTotal: 87 },
{ date: '3月', valueMax: 97, valueMin: 2, numTotal: 98 },
{ date: '4月', valueMax: 87, valueMin: 3, numTotal: 89 },
{ date: '5月', valueMax: 97, valueMin: 4, numTotal: 99 },
{ date: '6月', valueMax: 68, valueMin: 2, numTotal: 67 },
],
},
],
}
this.dataSource = this.nodeTable(data)
},
nodeTable(res) {
let arr = []
res.data.forEach((item) => {
let commonObj = {
pointName: item.pointName,
limitRange: item.limitRange,
}
let valueMaxArr = { ...commonObj, attr: '最高值' }
let valueMinArr = { ...commonObj, attr: '最低值' }
let numTotalArr = { ...commonObj, attr: '总次数' }
item.datas.forEach((item2) => {
let str = item2.date
valueMaxArr['data.' + str] = item2.valueMax
valueMinArr['data.' + str] = item2.valueMin
numTotalArr['data.' + str] = item2.numTotal
})
arr.push(valueMaxArr)
arr.push(valueMinArr)
arr.push(numTotalArr)
})
arr = arr.map((item, index) => {
item.id = index + 1
return item
})
console.log(arr, 'arar')
this.columns = [...this.saveColumnsNode, ...this.changeCoulmns(res)]
return arr
},
changeCoulmns(res) {
let addColumns = []
if (res.data.length) {
addColumns = res.data[0].datas.map((item) => {
let str = item.date
return {
title: str,
dataIndex: `data.${str}`,
align: 'center',
}
})
}
return addColumns
},
columnsInit(value, row, index, num) {
const obj = {
children: value,
attrs: {},
}
if (index === 0 || index % num === 0) {
obj.attrs.rowSpan = num
}
for (let i = 1; i <= num; i++) {
if (index % num === i) {
obj.attrs.rowSpan = 0
}
}
return obj
},
},
}
</script>
<style>
.bg {
background-color: #fff;
}
</style>