【实习小tip】elementUI动态数组表单给每个子对象输入框增加校验规则、对象扁平化

25 篇文章 0 订阅
23 篇文章 0 订阅

elementUI动态数组表单给每个子对象输入框增加校验规则

效果如图

重点还是在el-form-item 组件上的 prop 属性的值必须和el-input等 组件上的 v-model 属性的值对应,然后再添加:rules字段添加规则

如:

<el-form-item :prop="'types.' + tyIdx + '.categoryItems.' + cateIdx + '.standardContext'" :rules="[{required: true,message: '请输入标准',trigger: 'blur'}]">
	<el-input v-model="item.standardContext" :data-list="[]"
		:maxlength="50" :readonly="isView"
		style="width:84.5%" placeholder="请输入标准(必填)"/>
</el-form-item>

全部代码:

<sp-form-group v-model="isCollapse['types']" name="分类标准" :add="isEdit"
							:clear="form.types && form.types.length > 1 && form.types.filter(row => row.isDeleted !== 1).length > 1  && isEdit"
							@add="clicktypesAdd()" @clear="clearSub(form.types, '分类标准')">
							<ul class="form-group-list">
								<template v-for="(tyItem, tyIdx) in form.types || []">
									<li v-if="tyItem.isDeleted != 1" :key="tyIdx" class="form-group-list-item"
										style="background: #f2f3f5">
										<div style="flex: 1;">
											<el-row :gutter="24">
												<el-col :md="16" :lg="16" :xl="16">
													<el-form-item label="标准分类" :prop="'types.' + tyIdx + '.typeName'" :rules="[{required: true,message: '请选择标准分类',trigger: 'blur'}]">
														<sp-select v-model="tyItem.typeName" :maxlength="255"
															placeholder="请选择分类(必填)" :readonly="isView">
															<el-option v-for="typeItem in Types || []"
																:value="typeItem.typeName" :key="typeItem.id"
																:label="typeItem.typeName"></el-option>
														</sp-select>
														<el-button icon="el-icon-plus" @click="clicktypesAdd()"
															v-if="isEdit">
														</el-button>
														<el-button type="primary" v-if="isEdit"
															@click="clickCateSmallItemAdd(tyIdx)">添加分类项目</el-button>
													</el-form-item>
												</el-col>
											</el-row>
											<template
												v-for="(casmaItem, cateIdx) in form.types[tyIdx].categoryItems || []">
												<el-row :gutter="24" :key="cateIdx">
													<el-col :md="12" :lg="12" :xl="12">
														<div v-if="isView">分类项目</div>
														<el-form-item :prop="'types.' + tyIdx + '.categoryItems.' + cateIdx + '.itemName'" :rules="[{required: true,message: '请输入分类项目',trigger: 'blur'}]">
															<sp-text v-model="casmaItem.itemName"
																placeholder="请输入分类项目(必填)" :maxlength="10" :precision="0"
																:size="formSize" :readonly="isView" />
														</el-form-item>
													</el-col>
													<el-col :md="9" :lg="9" :xl="9">
														<div v-if="isView">分值</div>
														<el-form-item :prop="'types.' + tyIdx + '.categoryItems.' + cateIdx + '.score'" :rules="[{required: true,message: '请输入分值',trigger: 'blur'}]">
															<sp-text v-model="casmaItem.score" :maxlength="10"
																style="width: 93%;" placeholder="请输入分值(必填)"
																:readonly="isView" />
														</el-form-item>
													</el-col>
													<el-col :md="1" :lg="1" :xl="1">
														<el-form-item>
														</el-form-item>
													</el-col>
													<el-col :md="2" :lg="2" :xl="2">
														<el-form-item>
															<el-button
																v-if="form.types[tyIdx].categoryItems.length != 1 && isEdit"
																circle icon="el-icon-delete-solid"
																@click="clickCateSmallItemDel(tyIdx, tyItem, cateIdx)"
																style="margin: 0%;"></el-button>
														</el-form-item>
													</el-col>
												</el-row>
												<div
													v-for="(item, i) in form.types[tyIdx].categoryItems[cateIdx].standards || []">
													<el-row :gutter="24" :key="i">

														<el-col :md="24" :lg="24" :xl="24">
															<div v-if="isView">标准</div>
															<el-form-item :prop="'types.' + tyIdx + '.categoryItems.' + cateIdx + '.standardContext'" :rules="[{required: true,message: '请输入标准',trigger: 'blur'}]">
																<sp-text v-model="item.standardContext" :data-list="[]"
																	:maxlength="50" :readonly="isView"
																	style="width:84.5%" placeholder="请输入标准(必填)"/>
																<el-button
																	v-if="form.types[tyIdx].categoryItems[cateIdx].standards.length != 1 && isEdit"
																	circle icon="el-icon-delete"
																	@click="clickStandardItemDel(tyIdx, cateIdx, tyItem, i)"
																	style="margin: 0%;"></el-button>
																<el-button circle icon="el-icon-plus" v-if="isEdit"
																	@click="clickStandardItemAdd(tyIdx, cateIdx)"
																	style="margin: 0%;"></el-button>
															</el-form-item>
														</el-col>
													</el-row>
												</div>
											</template>

										</div>
										<el-popconfirm placement="top-end" title="确定删除该条子表信息?" v-if="isEdit"
											@confirm="clicktypesDel(tyItem, tyIdx)">
											<el-link slot="reference" type="danger" style="margin-left: 30px;">删除
											</el-link>
										</el-popconfirm>
									</li>
								</template>
							</ul>
						</sp-form-group><sp-form-group v-model="isCollapse['types']" name="分类标准" :add="isEdit"
	:clear="form.types && form.types.length > 1 && form.types.filter(row => row.isDeleted !== 1).length > 1  && isEdit"
	@add="clicktypesAdd()" @clear="clearSub(form.types, '分类标准')">
	<ul class="form-group-list">
		<template v-for="(tyItem, tyIdx) in form.types || []">
			<li v-if="tyItem.isDeleted != 1" :key="tyIdx" class="form-group-list-item"
				style="background: #f2f3f5">
				<div style="flex: 1;">
					<el-row :gutter="24">
						<el-col :md="16" :lg="16" :xl="16">
							<el-form-item label="标准分类" :prop="'types.' + tyIdx + '.typeName'" :rules="[{required: true,message: '请选择标准分类',trigger: 'blur'}]">
								<sp-select v-model="tyItem.typeName" :maxlength="255"
									placeholder="请选择分类(必填)" :readonly="isView">
									<el-option v-for="typeItem in Types || []"
										:value="typeItem.typeName" :key="typeItem.id"
										:label="typeItem.typeName"></el-option>
								</sp-select>
								<el-button icon="el-icon-plus" @click="clicktypesAdd()"
									v-if="isEdit">
								</el-button>
								<el-button type="primary" v-if="isEdit"
									@click="clickCateSmallItemAdd(tyIdx)">添加分类项目</el-button>
							</el-form-item>
						</el-col>
					</el-row>
					<template
						v-for="(casmaItem, cateIdx) in form.types[tyIdx].categoryItems || []">
						<el-row :gutter="24" :key="cateIdx">
							<el-col :md="12" :lg="12" :xl="12">
								<div v-if="isView">分类项目</div>
								<el-form-item :prop="'types.' + tyIdx + '.categoryItems.' + cateIdx + '.itemName'" :rules="[{required: true,message: '请输入分类项目',trigger: 'blur'}]">
									<sp-text v-model="casmaItem.itemName"
										placeholder="请输入分类项目(必填)" :maxlength="10" :precision="0"
										:size="formSize" :readonly="isView" />
								</el-form-item>
							</el-col>
							<el-col :md="9" :lg="9" :xl="9">
								<div v-if="isView">分值</div>
								<el-form-item :prop="'types.' + tyIdx + '.categoryItems.' + cateIdx + '.score'" :rules="[{required: true,message: '请输入分值',trigger: 'blur'}]">
									<sp-text v-model="casmaItem.score" :maxlength="10"
										style="width: 93%;" placeholder="请输入分值(必填)"
										:readonly="isView" />
								</el-form-item>
							</el-col>
							<el-col :md="1" :lg="1" :xl="1">
								<el-form-item>
								</el-form-item>
							</el-col>
							<el-col :md="2" :lg="2" :xl="2">
								<el-form-item>
									<el-button
										v-if="form.types[tyIdx].categoryItems.length != 1 && isEdit"
										circle icon="el-icon-delete-solid"
										@click="clickCateSmallItemDel(tyIdx, tyItem, cateIdx)"
										style="margin: 0%;"></el-button>
								</el-form-item>
							</el-col>
						</el-row>
						<div
							v-for="(item, i) in form.types[tyIdx].categoryItems[cateIdx].standards || []">
							<el-row :gutter="24" :key="i">

								<el-col :md="24" :lg="24" :xl="24">
									<div v-if="isView">标准</div>
									<el-form-item :prop="'types.' + tyIdx + '.categoryItems.' + cateIdx + '.standardContext'" :rules="[{required: true,message: '请输入标准',trigger: 'blur'}]">
										<sp-text v-model="item.standardContext" :data-list="[]"
											:maxlength="50" :readonly="isView"
											style="width:84.5%" placeholder="请输入标准(必填)"/>
										<el-button
											v-if="form.types[tyIdx].categoryItems[cateIdx].standards.length != 1 && isEdit"
											circle icon="el-icon-delete"
											@click="clickStandardItemDel(tyIdx, cateIdx, tyItem, i)"
											style="margin: 0%;"></el-button>
										<el-button circle icon="el-icon-plus" v-if="isEdit"
											@click="clickStandardItemAdd(tyIdx, cateIdx)"
											style="margin: 0%;"></el-button>
									</el-form-item>
								</el-col>
							</el-row>
						</div>
					</template>
				</div>
				<el-popconfirm placement="top-end" title="确定删除该条子表信息?" v-if="isEdit"
					@confirm="clicktypesDel(tyItem, tyIdx)">
					<el-link slot="reference" type="danger" style="margin-left: 30px;">删除
					</el-link>
				</el-popconfirm>
			</li>
		</template>
	</ul>
</sp-form-group>

报错:Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘full_user_name’ in ‘field list’

问了后端,是数据库这个字段没了

对象扁平化

参考文章

QualityManageApi.get(this.params.id).then((res) => {
	const data = res.data
	this.form = data
    //对象扁平化函数
	const flat = function(obj = {}, preKey = "", res = {}) {
	  //空值判断,如果obj是空,直接返回
	  if(!obj) return
	  //获取obj对象的所有[key,value]数组并且遍历,forEach的箭头函数中用了解构
	  Object.entries(obj).forEach(([key,value])=>{
		if(Array.isArray(value)){
		  //如果obj是数组,那么key就是数组的index,value就是对应的value
		  //obj是数组的话就用[]引起来
		  //因为value是数组,数组后面是直接跟元素的,不需要.号
		  let temp = Array.isArray(obj) ? `${preKey}[${key}]` : `${preKey}${key}`
		  flat(value,temp,res)
		}else if(typeof value === 'object'){
		  //因为value是对象类型,所以在末尾需要加.号
		  let temp = Array.isArray(obj) ? `${preKey}[${key}].` : `${preKey}${key}.`
		  flat(value,temp,res)
		}else{
		  let temp = Array.isArray(obj) ? `${preKey}[${key}]` : `${preKey}${key}`
		  res[temp] = value
		}
	  })
	  return res;
	}
	const form1 = flat(data)
	console.log(form1) 

效果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个示例代码: ```html <el-table :data="tableData" style="width: 100%"> <el-table-column prop="name" label="姓名"> <template slot-scope="scope"> <el-form-item :prop="'name'+scope.$index" :rules="[{required: true, message: '请输入姓名', trigger: 'blur'}]"> <el-input v-model="scope.row.name" :class="{error: $refs['name'+scope.$index][0].validateState === 'error'}" ref="name{{scope.$index}}" clearable></el-input> <div class="error-tip" v-if="$refs['name'+scope.$index][0].validateState === 'error'">{{$refs['name'+scope.$index][0].validateMessage}}</div> </el-form-item> </template> </el-table-column> <el-table-column prop="age" label="年龄"> <template slot-scope="scope"> <el-form-item :prop="'age'+scope.$index" :rules="[{required: true, message: '请输入年龄', trigger: 'blur'}, {type: 'number', message: '年龄必须为数字', trigger: 'blur'}]"> <el-input v-model.number="scope.row.age" :class="{error: $refs['age'+scope.$index][0].validateState === 'error'}" ref="age{{scope.$index}}" clearable></el-input> <div class="error-tip" v-if="$refs['age'+scope.$index][0].validateState === 'error'">{{$refs['age'+scope.$index][0].validateMessage}}</div> </el-form-item> </template> </el-table-column> </el-table> ``` 在上面的代码中,我们使用了 Element UI 提供的 el-form-item 控件来对输入框进行校验。在 el-form-item 控件中,我们设置了 prop 属性,值为 `'name'+scope.$index` 或 `'age'+scope.$index`,这样就可以对每个输入框进行独立的校验。 在 el-form-item 控件中,我们还设置了 rules 属性,用来定义校验规则。在本例中,我们为姓名和年龄两个输入框设置了不同的校验规则。 在 el-input 控件中,我们设置了 v-model 属性,用来绑定输入框的值。我们还设置了 :class 属性,用来动态控制输入框的样式。当输入框校验状态为 error 时,我们会为输入框一个 error 类,这样输入框的边框就会变成红色。 最后,在每个输入框下方,我们使用了一个 div 控件,用来显示校验失败的提示信息。我们通过 $refs 获取到每个 el-form-item 控件,并判断它的 validateState 属性是否为 error,如果是,就显示相应的提示信息。 希望这个示例能够帮到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值