动态添加表头和表格数据,表头的value表格中需要加入
横向表格第一列既要作为固定列表头也需要给后端当做参数,横向的表头同样是作为固定列同时作为参数传递,后端需要的表格结构是纵向的每一个步骤作为对象中的一个值,纵向的时间体积循环周期等都是对象的值,包含这些值的对象放入后端需求的数组中,就是后端需要的数据结构(这里有个更简单的方式,跟后端沟通让后端改,哈哈哈)
html部分
<div style="text-align: right">
<el-button v-if="!data.isShow" class="qm_class" @click="addZhongziList()">添加</el-button>
</div>
<el-row style="margin: 1% 0">
<el-table
:data="lvdaiTable"
border
:key="data.formlist.spjlmxListNochange"
style="width: 100%"
:span-method="objectSpanMethod"
:header-cell-style="headerStyle"
:render-header="renderHeader"
>
<el-table-column prop="title" label="" align="center">
<template #default="scope">
<div v-if="scope.$index == 0 || scope.$index == 1" style="color: #000; font-weight: 700">
{{ colTableTitle[scope.$index].title }}
</div>
<div v-if="scope.$index > 1">
<div style="display: flex; align-items: center">
<div>第</div>
<div>
<num-input
v-model="data.formlist.spjlmxListNochange[0].children[scope.$index + 1].xunhuan"
:precision="2"
:disabled="data.isShow"
style="margin-bottom: 10px; width: 70%"
placeholder="请输入循环信息"
@input="data.formlist.spjlmxListNochange[0].children[scope.$index + 1].xunhuan"
/>
</div>
<div>循环</div>
</div>
<div style="display: flex; align-items: center">
<div>第</div>
<div>
<num-input
v-model="data.formlist.spjlmxListNochange[0].children[scope.$index + 1].zhouqi"
:precision="2"
:disabled="data.isShow"
placeholder="请输入周期信息"
style="width: 70%"
@input="data.formlist.spjlmxListNochange[0].children[scope.$index + 1].zhouqi"
/>
</div>
<div>周期</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="title" label="循环步骤" align="center">
<template #default="scope">
<span style="text-align: center; width: 100%; display: inline-block">{{ lvdaiTable[scope.$index].title }}</span>
</template>
</el-table-column>
<el-table-column
v-for="(item, index) in data.formlist.spjlmxListNochange"
:key="index"
:label="item.buzhou"
prop="buzhou"
header-align="center"
align="center"
>
<template #default="scope">
<!-- {{ scope.row }} -->
<el-input v-if="scope.row.label != 'shijian'" v-model="item.children[scope.$index].tiji" :disabled="data.isShow" />
<el-time-picker
v-else
v-model="item.children[scope.$index + 1].shijian"
placeholder="选择时分"
style="width: 100%"
:disabled="data.isShow"
value-format="HH:mm"
format="HH:mm"
/>
</template>
</el-table-column>
<el-table-column label="操作" header-align="center" align="center" fixed="right">
<template #default="scope">
<span v-if="scope.$index === 0 || scope.$index === 1">设定值不允许删除操作</span>
<el-button v-if="!data.isShow && scope.$index > 1" type="danger" link @click="delZhongziList(scope.$index, 'yxsjList')"
>删除
</el-button>
</template>
</el-table-column>
</el-table>
</el-row>
js部分 vue3的写法
const colTableTitle = reactive([
{ title: 'SSMB信息', label: 'shedingzhi' },
{ title: 'SSMB信息', label: 'shedingzhi' }
])
const lvdaiTable = reactive([
{ title: '时间(设定值)', label: 'shijian' },
{ title: '体积(设定值)', label: 'tiji' }
])
自定义的表格需要的数据格式
let data = reactive({
spjlmxList:[],// 后端需要的数组,后面进行了赋值,
spjlmxListNochange:[ // 自己定义的数组,不需要提交给后端
{
buzhou: 'A',
xunhuan: '',
zhouqi: '',
children: [
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
},
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
}
]
},
{
buzhou: 'B',
xunhuan: '',
zhouqi: '',
children: [
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
},
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
}
]
},
{
buzhou: 'C',
xunhuan: '',
zhouqi: '',
children: [
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
},
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
}
]
},
{
buzhou: 'D',
xunhuan: '',
zhouqi: '',
children: [
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
},
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
}
]
},
{
buzhou: 'E',
xunhuan: '',
zhouqi: '',
children: [
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
},
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
}
]
},
{
buzhou: 'F',
xunhuan: '',
zhouqi: '',
children: [
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
},
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
}
]
},
{
buzhou: 'I',
xunhuan: '',
zhouqi: '',
children: [
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
},
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
}
]
}
]
})
// 添加一个循环
const addZhongziList = () => { // 这个表格时间体积各占一行,所以增加删除都是一起添加两个对象,表格数据添加,第一列第二列也需要对应添加
lvdaiTable.push({ title: '时间', label: 'shijian' }, { title: '体积', label: 'tiji' })
colTableTitle.push({ title: '循环', label: 'xunhuan' }, { title: '周期', label: 'zhouqi' })
data.spjlmxListNochange.forEach(item => {
item.children.push(
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
},
{
buzhou: '',
xunhuan: '',
zhouqi: '',
shijian: null,
tiji: ''
}
)
})
}
// 删除循环
const delZhongziList = (index: number, key) => {
// console.log(index, 'index')
lvdaiTable.splice(index, 2)
colTableTitle.splice(index, 2)
data.spjlmxListNochange.forEach(item => {
item.children.splice(index, 2)
})
}
// 提交时处理数据格式
let arrList = []
let lastList = []
let arrA = []
let arrB = []
let arrC = []
let arrD = []
let arrE = []
let arrF = []
let arrI = []
const subDataList = () => {
data.spjlmxListNochange.forEach((item, idx) => {
item.children.forEach((child, index) => {
// console.log(index, 'index')
child.buzhou = item.buzhou
if (index === 0 || index === 1) {
child.zhouqi = null
child.xunhuan = null
}
if (index % 2 !== 0) {
arrList.push(child)
}
})
})
arrList.forEach((item, index) => {
if (item.buzhou === 'A') {
arrA.push(item)
} else if (item.buzhou === 'B') {
arrB.push(item)
} else if (item.buzhou === 'C') {
arrC.push(item)
} else if (item.buzhou === 'D') {
arrD.push(item)
} else if (item.buzhou === 'E') {
arrE.push(item)
} else if (item.buzhou === 'F') {
arrF.push(item)
} else if (item.buzhou === 'I') {
arrI.push(item)
}
arrA.forEach((arrAitem, arrAindex) => {
arrB.forEach((val, idx) => {
if (arrAindex === idx) {
val.xunhuan = arrAitem.xunhuan
val.zhouqi = arrAitem.zhouqi
}
})
arrC.forEach((val, idx) => {
if (arrAindex === idx) {
val.xunhuan = arrAitem.xunhuan
val.zhouqi = arrAitem.zhouqi
}
})
arrD.forEach((val, idx) => {
if (arrAindex === idx) {
val.xunhuan = arrAitem.xunhuan
val.zhouqi = arrAitem.zhouqi
}
})
arrE.forEach((val, idx) => {
if (arrAindex === idx) {
val.xunhuan = arrAitem.xunhuan
val.zhouqi = arrAitem.zhouqi
}
})
arrF.forEach((val, idx) => {
if (arrAindex === idx) {
val.xunhuan = arrAitem.xunhuan
val.zhouqi = arrAitem.zhouqi
}
})
arrI.forEach((val, idx) => {
if (arrAindex === idx) {
val.xunhuan = arrAitem.xunhuan
val.zhouqi = arrAitem.zhouqi
}
})
})
})
lastList = arrA.concat(arrB, arrC, arrD, arrE, arrF, arrI)
// data.formlist.spjlmxList = arrList
data.spjlmxList = lastList
}
//合并列
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
if (columnIndex === 0 && rowIndex % 2 === 0) {
return [2, 1] // 第一个值代表 rowspan,第二个值代表 colspan
} else if (columnIndex === 0 && rowIndex % 2 !== 0) {
return [0, 0] // 隐藏当前单元格
}
if (columnIndex === 9) {
if (rowIndex > 1) {
return [2, 1]
}
}
}
const headerStyle = ({ row, column, rowIndex, columnIndex }) => {
if (columnIndex === 0 && rowIndex === 0) {
// 将表头第一列隐藏
return {
'border-bottom': 'none'
}
}
}
// 由于有详情页面,提交的数据需要再页面展示,所以对返回的数据进行拆分匹配页面需要的数据格式
let backArrA = []
let backArrB = []
let backArrC = []
let backArrD = []
let backArrE = []
let backArrF = []
let backArrI = []
const changeDetailData = () => {
// console.log(JSON.parse(JSON.stringify(data.formlist.spjlmxList)), 'spjlmxList')
data.spjlmxList.forEach((item, index) => {
if (item.buzhou === 'A') {
backArrA.push(item)
} else if (item.buzhou === 'B') {
backArrB.push(item)
} else if (item.buzhou === 'C') {
backArrC.push(item)
} else if (item.buzhou === 'D') {
backArrD.push(item)
} else if (item.buzhou === 'E') {
backArrE.push(item)
} else if (item.buzhou === 'F') {
backArrF.push(item)
} else if (item.buzhou === 'I') {
backArrI.push(item)
}
})
let num = backArrA.length - lvdaiTable.length / 2
data.spjlmxListNochange.forEach((item, index) => {
item.children = []
if (item.buzhou === 'A') {
backArrA.forEach((val, idx) => {
item.children.push(val, val)
})
} else if (item.buzhou === 'B') {
backArrB.forEach((val, idx) => {
item.children.push(val, val)
})
} else if (item.buzhou === 'C') {
backArrC.forEach((val, idx) => {
item.children.push(val, val)
})
} else if (item.buzhou === 'D') {
backArrD.forEach((val, idx) => {
item.children.push(val, val)
})
} else if (item.buzhou === 'E') {
backArrE.forEach((val, idx) => {
item.children.push(val, val)
})
} else if (item.buzhou === 'F') {
backArrF.forEach((val, idx) => {
item.children.push(val, val)
})
} else if (item.buzhou === 'I') {
backArrI.forEach((val, idx) => {
item.children.push(val, val)
})
}
})
for (var i = 0; i < num; i++) {
lvdaiTable.push({ title: '时间', label: 'shijian' }, { title: '体积', label: 'tiji' })
colTableTitle.push({ title: '循环', label: 'xunhuan' }, { title: '周期', label: 'zhouqi' })
}
}