后台-复杂动态表单校验

该代码示例展示了如何在Vue应用中使用ElementPlus库进行表单验证,包括金额范围和自定义区间抽成比例的输入验证。同时,它涵盖了从API获取数据、编辑、保存和删除数据的逻辑,以及动态表单的交互和校验规则。
摘要由CSDN通过智能技术生成

 点击某一行编辑,点保存时触发校验当前行的规则

<script setup lang="ts">
	import { ref, reactive } from 'vue'
	import { ElMessage, FormInstance, FormRules } from 'element-plus'
	import {
		getOrderFeeSetting,
		changeParameter,
		editOrderFeeSetting,
		addOrderFeeSetting,
		deleteOrderFeeSetting,
	} from '@/api/system/commission'
	import { Setting } from '@/types/api/system/commission'
	const moneyFormRef = ref<FormInstance>()
	const setupFormRef = ref<FormInstance>()
	// tab点击
	const tabPosition = ref<number>(1)
	// 需求状态列表
	const commissionList = ref([
		{ label: '设计抽成', value: 1 },
		{ label: '制造抽成', value: 2 },
		{ label: '集采抽成', value: 3 },
	])
	// 抽成金额
	const moneyForm = reactive<any>({
		max: '',
		min: '',
		disabled: true,
	})
	type setupFormType = {
		list: Setting[]
	}
	// 设置表单
	const setupForm = reactive<setupFormType>({
		list: [],
	})
	const moneyFormRules = reactive<FormRules>({
		max: [{ required: true, message: '请输入最大抽成金额', trigger: ['blur', 'change'] }],
		min: [{ required: true, message: '请输入最小抽成金额', trigger: ['blur', 'change'] }],
	})
	const setupFormRules = reactive<FormRules>({
		minValue: [{ required: true, message: '请输入最小金额', trigger: 'blur' }],
		maxValue: [{ required: true, message: '请输入最大金额', trigger: 'blur' }],
		feeRate: [
			{ required: true, message: '请输入抽成比例', trigger: 'blur' },
			{
				pattern: /^([0-9]\d{0,1}|100$)(\.\d{1,2})?$/,
				message: '请输入正确的抽成比例',
				trigger: 'blur',
			},
		],
	})
	// 获取数据
	const getOrderFeeSettingFn = () => {
		getOrderFeeSetting(tabPosition.value).then(({ data }) => {
			moneyForm.min = data.limitValues ? data.limitValues[0] : ''
			moneyForm.max = data.limitValues ? data.limitValues[1] : ''
			data.settings.forEach((item, index, arr) => {
				arr[index].saveOrEditButton = true
				arr[index].disabled = true
				arr[index].level = index + 1
			})
			setupForm.list = data.settings
		})
	}
	getOrderFeeSettingFn()
	// 类型切换
	const handleClick = (value: any) => {
		tabPosition.value = value
		moneyForm.disabled = true
		getOrderFeeSettingFn()
	}
	// 改变合同金额
	const changeNumber = (val: any, type: string) => {
		if (val <= 0) {
			moneyForm[type] = null
		} else {
			moneyForm[type] = Number(Number(val).toFixed(2))
		}
	}
	// 保存金额
	const saveMoneyForm = async (formEl: FormInstance | undefined) => {
		if (!moneyForm.disabled) {
			if (!formEl) return
			await formEl.validate((valid, fields) => {
				if (valid) {
					moneyForm.disabled = true
					const moneyArr = []
					moneyArr[0] = moneyForm.min
					moneyArr[1] = moneyForm.max
					const stringArr = JSON.stringify(moneyArr)
					let code = ''
					if (tabPosition.value == 1) {
						code = 'pay_fee_design_limit'
					} else if (tabPosition.value == 2) {
						code = 'pay_fee_make_limit'
					} else {
						code = ''
					}
					changeParameter(code, stringArr).then((res) => {
						ElMessage.success('保存成功')
					})
				} else {
					return false
				}
			})
		} else {
			moneyForm.disabled = false
		}
	}
	// 添加某一行
	const addRow = () => {
		const row = {
			level: setupForm.list.length + 1,
			minValue: '',
			maxValue: '',
			feeRate: '',
			saveOrEditButton: true,
			disabled: true,
		}
		const data = {
			level: setupForm.list.length + 1,
			minValue: 0,
			maxValue: 0,
			feeRate: 0,
			id: '',
			fmOrderType: tabPosition.value,
		}
		addOrderFeeSetting(data).then((res) => {
			ElMessage.success('添加成功')
		})
		setupForm.list.push(row)
	}
	// 删除某一行
	const deleteRow = (index: number, id: string | undefined) => {
		setupForm.list.splice(index, 1)
		setupForm.list.forEach((item, index, arr) => {
			arr[index].level = index + 1
		})
		deleteOrderFeeSetting(id as string).then((res) => {
			ElMessage.success('删除成功')
		})
	}
	// 修改每一行
	const saveOrEdit = (formEl: FormInstance | undefined, index: number) => {
		if (!setupForm.list[index].saveOrEditButton) {
			if (!formEl) return
			formEl.clearValidate()
			formEl.validateField([`list[${index}].minValue`, `list[${index}].maxValue`, `list[${index}].feeRate`], (valid) => {
				if (valid) {
					setupForm.list[index].saveOrEditButton = true
					setupForm.list[index].disabled = true
					const id = setupForm.list[index].id
					const row = setupForm.list[index]
					delete row.id
					editOrderFeeSetting(id as string, row).then((data) => {
						if (data) ElMessage.success('保存成功')
					})
				} else {
					return false
				}
			})
		}
		setupForm.list[index].saveOrEditButton = false
		setupForm.list[index].disabled = false
	}
</script>

<template>
	<el-card class="commission-container">
		<div>
			<el-radio-group v-model="tabPosition" style="margin-bottom: 20px" @change="handleClick">
				<template v-for="(item, index) in commissionList" :key="index">
					<el-radio-button :label="item.value">
						{{ item.label }}
					</el-radio-button>
				</template>
			</el-radio-group>
		</div>

		<el-form
			ref="moneyFormRef"
			:model="moneyForm"
			:rules="moneyFormRules"
			label-width="120px"
			class="moneyForm"
			size="default"
			status-icon>
			<div>
				<el-form-item label="最大抽成金额" prop="max">
					<el-input
						v-model="moneyForm.max"
						type="number"
						@change="(val: any) => changeNumber(val, 'max')"
						:disabled="moneyForm.disabled" />
				</el-form-item>
				<el-form-item label="最小抽成金额" prop="min">
					<el-input
						v-model="moneyForm.min"
						type="number"
						@change="(val: any) => changeNumber(val, 'min')"
						:disabled="moneyForm.disabled" />
				</el-form-item>
			</div>
			<div class="button">
				<el-button type="primary" size="default" @click="saveMoneyForm(moneyFormRef)">{{
					moneyForm.disabled ? '编辑' : '保存'
				}}</el-button>
			</div>
		</el-form>

		<el-form
			ref="setupFormRef"
			:model="setupForm"
			:rules="setupFormRules"
			label-width="120px"
			class="setupForm"
			size="default"
			status-icon>
			<div class="header">
				<span>抽成区间设置</span>
				<el-button type="primary" size="default" @click="addRow">添加</el-button>
			</div>
			<div class="levelItem" v-for="(item, index) in setupForm.list" :key="index">
				<div class="left">
					<el-form-item required :label="`金额区间${item.level}`">
						<el-form-item :prop="`list[${index}].minValue`" :rules="setupFormRules.minValue">
							<el-input
								style="width: 200px"
								v-model="setupForm.list[index].minValue"
								type="number"
								:disabled="item.disabled" />
							<span class="line"></span>
						</el-form-item>
						<el-form-item :prop="`list[${index}].maxValue`" :rules="setupFormRules.maxValue">
							<el-input
								style="width: 200px"
								v-model="setupForm.list[index].maxValue"
								type="number"
								:disabled="item.disabled" />
						</el-form-item>
					</el-form-item>
					<el-form-item label="抽成比例(%)" :prop="`list[${index}].feeRate`" :rules="setupFormRules.feeRate">
						<el-input v-model="setupForm.list[index].feeRate" type="number" :disabled="item.disabled" />
					</el-form-item>
				</div>
				<div class="right">
					<el-button @click="saveOrEdit(setupFormRef, index)" type="primary">{{
						item.saveOrEditButton ? '编辑' : '保存'
					}}</el-button>
					<el-button type="danger" @click="deleteRow(index, item.id)">删除</el-button>
				</div>
			</div>
		</el-form>
	</el-card>
</template>

<style lang="scss" scoped>
	.commission-container {
		min-height: 80vh;
		:deep(.is-active) {
			.el-radio-button__inner {
				background-color: #3760f1;
				border-color: #3760f1;
			}
		}
		:deep(.el-radio-button__inner) {
			&:hover {
				color: #3760f1;
			}
		}
		:deep(.el-form-item__label) {
			color: #606266;
			font-weight: normal;
			font-size: 15px;
			width: 130px !important;
		}
		.moneyForm {
			display: flex;
			align-items: center;
			.el-button {
				position: relative;
				top: -8px;
			}
		}
		.setupForm {
			background-color: #f2f2f2;
			overflow: hidden;
			padding-left: 30px;
			.header {
				margin: 30px 0;
				span {
					color: #606266;
					font-weight: normal;
					font-size: 15px;
					margin-right: 12px;
				}
			}
			.levelItem {
				display: flex;
				align-items: center;
				margin-bottom: 30px;
				.line {
					width: 100px;
					height: 1px;
					background-color: #333;
					display: inline-block;
				}
			}
		}
	}
</style>

表格内的动态表单校验

	const state = reactive({
		formTable: {
			tableData: [] as any,
		},
	})
	const {  formTable } = toRefs(state)

	const formTableRef = ref<FormInstance>()

   	//校验规则
	const rules = {
		startValue: [{ validator: CheckStartValue, trigger: ['blur', 'change'], required: true }],
		endValue: [{ validator: CheckEndValue, trigger: ['blur', 'change'], required: true }],
	}


    	<el-form ref="formTableRef" :model="formTable" :inline="true">
				<el-table
					size="small"
					header-cell-class-name="headerCell"
					:cell-style="{ height: '37px' }"
					:data="formTable.tableData"
					highlight-current-row
					:row-class-name="tableRowClassName"
					:height="tableHeight"
					v-loading="tablePersonLoading"
					border
					element-loading-text="拼命加载中"
					style="width: 100%">
					<el-table-column :resizable="false" type="index" width="50" label="序号"></el-table-column>
					<el-table-column prop="name" label="个人信用等级"> </el-table-column>
					<el-table-column prop="startValue" label="个人起始分值(含)">
						<template #default="{ row, $index }">
							<el-form-item :prop="`tableData[${$index}].startValue`" :rules="rules.startValue" v-if="row.isShowInput">
								<el-input v-model="formTable.tableData[$index].startValue" type="number" :disabled="$index == 0"></el-input>
							</el-form-item>
							<span v-else>{{ row.startValue }}</span>
						</template>
					</el-table-column>
					<el-table-column prop="endValue" label="个人结束分值(不含)">
						<template #default="{ row, $index }">
							<el-form-item :prop="`tableData[${$index}].endValue`" :rules="rules.endValue" v-if="row.isShowInput">
								<el-input v-model="formTable.tableData[$index].endValue" type="number"> </el-input>
							</el-form-item>
							<span v-else>{{ row.endValue }}</span>
						</template>
					</el-table-column>
					<el-table-column label="操作" width="125">
						<template #default="{ row, $index }">
							<el-button type="primary" size="small" @click="updateRow(row, $index)" v-if="row.isCanEdit">编辑</el-button>
							<el-button type="info" size="small" @click="getData" v-if="row.isShowSave">取消</el-button>
							<el-button
								type="primary"
								size="small"
								:loading="row.saveLoading"
								@click="submitForm(formTableRef, row)"
								v-if="row.isShowSave"
								>保存</el-button
							>
						</template>
					</el-table-column>
				</el-table>
			</el-form>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值