动态添加表格数据-纵向数据改成横向数据

动态添加表头和表格数据,表头的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' })
	}
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值