您当前的位置:首页 > 网站建设 > javascript
| php | asp | css | H5 | javascript | Mysql | Dreamweaver | Delphi | 网站维护 | 帝国cms | React | 考试系统 | ajax |

antd+vue实现动态验证循环属性表单的思路

51自学网 2022-05-02 21:31:07
  javascript

希望实现查询表单的某些属性可以循环验证必填项:

需求:

1.名称,对比项,备注必填,默认为一行,可增加多行

2.根据名称,动态请求对比项列表,名称变化时,清空该行当前选择的对比项

思路:将整个搜索分成了两个表单,分别去做验证。一个是可动态添加的循环表单form,另一个为普通表单dateForm

html

			<a-form :form="form" @keyup.enter.native='searchQuery'>				<div class="dynamic-wrap">					<div v-for="(item,index) in formList" :key="index">						<a-row :gutter="24">							<a-col :span="6">								<a-form-item label="名称" :labelCol="{span: 7}" :wrapperCol="{span: 17}">									<a-select placeholder='请选择名称'									          v-decorator="[`equipment[${index}]`,{ initialValue: formList[index] ? formList[index].equipment : '', rules: [{ required: true, message: '请选择设备!' }]}]"									          @change="(e)=>equipChange(e,index)">										<a-select-option v-for='options in formList[index].eqpList' :key='options.name' :value='options.name'>											{{ options.name }}										</a-select-option>									</a-select>								</a-form-item>							</a-col>							<a-col :span="6">								<a-form-item label="对比项" :labelCol="{span: 7}" :wrapperCol="{span: 17}">									<a-select										placeholder="请选择对比项"										v-decorator="[`dataCode[${index}]`,{initialValue: formList[index] ? formList[index].dataCode : '',rules: [{ required: true, message: '请选择对比项!' }]}]">										<a-select-option v-for='option in formList[index].dataTypeList' :key='option.name' :value='option.name'>											{{ option.name }}										</a-select-option>									</a-select>								</a-form-item>							</a-col>							<a-col :span="6">								<a-form-item label="备注" :labelCol="{span: 6}" :wrapperCol="{span: 18}">									<a-input v-decorator="[`remark[${index}]`]" placeholder="请输入备注"></a-input>								</a-form-item>							</a-col>							<a-col :span="2" style="padding-left: 0px">								<a-form-item :labelCol="{span: 0}" :wrapperCol="{span: 24}">									<template v-if="formList.length > 1">										<a-icon type="delete" @click="removeRow(index)"/>									</template>								</a-form-item>							</a-col>						</a-row>					</div>				</div>			</a-form> 			<a-form :form="dateForm" inline @keyup.enter.native='searchQuery'>				<a-form-item label='查询日期' :labelCol="{span: 8}" :wrapperCol="{span: 16}"				             style="display: inline-block;width: 300px;">					<a-date-picker						style="width: 200px;"						class='query-group-cust'						v-decorator="['startTime', { rules: [{ required: true, message: '请选择开始时间!' }] }]"						:disabled-date='disabledStartDate'						format='YYYY-MM-DD'						placeholder='请选择开始时间'						@change='handleStart($event)'						@openChange='handleStartOpenChange'></a-date-picker>				</a-form-item>				<span :style="{ display: 'inline-block', width: '24px', textAlign: 'center' }">-</span>				<a-form-item style="display: inline-block;width: 200px;">					<a-date-picker						style="width: 200px;"						class='query-group-cust'						v-decorator="['endTime', { rules: [{ required: true, message: '请选择结束时间!' }] }]"						:disabled-date='disabledEndDate'						format='YYYY-MM-DD'						placeholder='请选择结束时间'						@change='handleEnd($event)'						:open='endOpen'						@openChange='handleEndOpenChange'></a-date-picker>				</a-form-item>				<span style="margin-left: 10px">				        <a-button type='primary' :disabled='loading' @click='searchQuery' icon='search'>查询</a-button>				        <a-button type='primary' @click='searchReset' icon='search' style='margin-left:10px'>重置</a-button>				        <a-button type="primary" icon="plus" @click="addRow" style='margin-left:10px'>新增查询条件</a-button>			        </span>			</a-form>			<p>查询条件为:{{searchData}}</p>

js

initForm() {				// 首先请求设备列表,存放在eqpList中				// 初始化form表单				this.formList.push({					equipment: '',					dataCode: '',					remark: '',					eqpList: this.eqpList,					dataTypeList: []				})			},			// 删除一行			handleRemove(index) {				if (this.formList.length === 1) {					return				}				this.formList.splice(index, 1)			},			// 新增一行			handleAdd() {				this.formList.push({					equipment: '',					dataCode: '',					remark: '',					eqpList: this.eqpList, // 可以根据接口动态获取,这里便于演示,直接赋值了					dataTypeList: [],// 可以根据接口动态获取并根据设备去关联				})			},			equipChange(value, index) {				// change赋值				this.formList[index].equipment = value;				//同步更新 当前选择的设备对应的对比项列表				this.handleEqpIdentity(value, index)			},			// 根据设备查询对应的对比项列表			handleEqpIdentity(value, index) {				this.dataTypeList = []; //清空dataTypeList				this.formList[index].dataTypeList = []; // 清空当前行的 dataTypeList				//根据新的设备名称 获取对应的对比项列表				getAction(this.url.getDataTypeList, {equipment: value})					.then((res) => {						if (res.success) {							this.dataTypeList = res.result;							this.formList[index].dataTypeList = this.dataTypeList;							// this.formList[index].dataCode = ''; 直接赋值为空 是无效的							//需使用 getFieldValue, setFieldsValue							let dataCode1Arr = this.form.getFieldValue('dataCode');							if (dataCode1Arr.length !== 0) {								dataCode1Arr[index] = ''							}							this.form.setFieldsValue({dataCode: dataCode1Arr})						} else {							this.$message.warning(res.message)						}					})					.catch(() => {						this.$message.error('获取失败,请重试!')					})			},// 点击查询			searchQuery() {				// 先验证循环表单				const {form: {validateFields}} = this				validateFields((error, values) => {					if (!error) {						this.dateForm.validateFields((dateErr, dateValues) => {							//再验证日期搜索表单							dateValues.startTime = moment(dateValues.startTime).format('YYYY-MM-DD')							dateValues.endTime = moment(dateValues.endTime).format('YYYY-MM-DD')							if (!dateErr) {								this.loading = true;								let formData = Object.assign({}, dateValues);								//整理成后台所需的数据结构								// 循环表单								let searchArr = [];								(values[`equipment`]).forEach((item, index) => {									const obj = {										equipment: item,										remark: values[`remark`][index],										dataCode: values[`dataCode`][index]									}									searchArr.push(obj); 								})								// 日期表单								if (!dateValues.startTime) {									formData.startTime = moment(new Date()).format('YYYY-MM-DD')								}								formData.eqpInfoParamVoList = searchArr;								this.searchData = JSON.parse(formData)							  //	请求接口							}						})					}				})			},

到此这篇关于antd vue实现动态验证循环属性表单的文章就介绍到这了,更多相关antd vue动态验证循环属性表单内容请搜索wanshiok.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持wanshiok.com!


Javascript基础知识中关于内置对象的知识
使用js实现瀑布流效果
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1