uniapp中UView中 u-form表单在v-for循环下如何进行表单校验

1、数据data格式

注:rule绑定的tableFromRule中要和表单tableFrom下面放置一个同名数组,确保u-form能找到

复制代码
tableFrom: {
					tableData: [
						//数据详情列表
					]
				},
				tableFromRule: {
					//校验
					tableData: [
						//数据详情列表
					]
				},
				formRules:{
					localation:[
						{
							required: true,
							message: '请填写xxxx',
							trigger: ['blur', 'change']
						}
					]
				},

2、dom结构

复制代码
<u-form labelPosition="left" labelAlign="right" :model="tableFrom" :rules="tableFromRule"
					labelWidth="auto" ref="uFormData">
		<view v-for="(item, index) in tableFrom.tableData" :key="index">
					xxxxxxx
		</view>
</u-form>

3、u-form-item格式必须用 :prop="tableData.${index}.localation"

复制代码
<u-form-item label="库位" :prop="'tableData.'+index+'.localation'" borderBottom>
     xxxxx
</u-form-item>

4、修改源码

找到async validateField(value, callback, event = null)函数进行替换

5、替换如下

复制代码
			// 对部分表单字段进行校验
			async validateField(value, callback, event = null) {
				// $nextTick是必须的,否则model的变更,可能会延后于此方法的执行
				this.$nextTick(() => {
					
					// 校验错误信息,返回给回调方法,用于存放所有form-item的错误信息
					const errorsRes = [];
					// 如果为字符串,转为数组
					value = [].concat(value);
					// 历遍children所有子form-item
					this.children.map((child) => {
				 
						// 用于存放form-item的错误信息
						const childErrors = [];
						if (value.includes(child.prop)) {
							// 获取对应的属性,通过类似'a.b.c'的形式
							const propertyVal = uni.$u.getProperty(
								this.model,
								child.prop
							);
							
							// 属性链数组
							const propertyChain = child.prop.split(".");
							const propertyName =
								propertyChain[propertyChain.length - 1];
							//修改:将const改为let 
							let rule = this.formRules[child.prop];
							//修改:链式是无法通过上面的方式获取的,改为下面的方式
							if(!rule){
								rule=uni.$u.getProperty(
								this.formRules,
								child.prop
								);
							
							}
							// 如果不存在对应的规则,直接返回,否则校验器会报错
							if (!rule) return;
							// rule规则可为数组形式,也可为对象形式,此处拼接成为数组
							const rules = [].concat(rule);
 
							// 对rules数组进行校验
							for (let i = 0; i < rules.length; i++) {
								const ruleItem = rules[i];
								
								// 将u-form-item的触发器转为数组形式
								const trigger = [].concat(ruleItem?.trigger);
								
								// 如果是有传入触发事件,但是此form-item却没有配置此触发器的话,不执行校验操作
								if (event && !trigger.includes(event)) continue;
								// 实例化校验对象,传入构造规则
								const validator = new Schema({
									[propertyName]: ruleItem,
								});
									
								validator.validate({
										[propertyName]: propertyVal,
									},
									(errors, fields) => {
									
										if (uni.$u.test.array(errors)) {
											errorsRes.push(...errors);
											childErrors.push(...errors);
										}
										child.message =
											childErrors[0]?.message ?? null;
									}
								);
							}
						}
					});
					// 执行回调函数
					typeof callback === "function" && callback(errorsRes);
				});
			},
			// 校验全部数据

6、在tableData每次塞数据的时候,执行如下代码

复制代码
this.tableFromRule.tableData.unshift(this.formRules)
相关推荐
deli00725 分钟前
2GB 文件传一半断网实测:HTTP 断点续传只补 15MB
前端
treasure14011 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
jay神12 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
屏什么录13 小时前
长时间录屏中途崩溃:MP4 打不开的 6 种救回方案与参数设置
前端·音视频开发
code_Bo13 小时前
不只命令行:我把跨 Agent 会话同步做成了桌面应用
前端·javascript·后端
kyriewen13 小时前
AI 能把页面写出来,为什么改个需求就开始崩?
前端·javascript·人工智能
OpsEye13 小时前
同一套用例跑两个大模型接口,差异到底出在哪
javascript·ai编程
X1A0RAN14 小时前
PPT 图片批量处理教程:导出全部幻灯片 · 提取全部素材
开发语言·javascript·powerpoint
涛涛ing14 小时前
2026年最值得关注的前端变化,藏在“默认值”里
前端
量化分析码农15 小时前
股票历史数据的复权参数对照:多级别返回的字段与数值差异
java·javascript·后端