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)
相关推荐
Ranye12312 分钟前
从 JS 到 Dart:语法基础
javascript·flutter·dart
烂蜻蜓43 分钟前
深入理解 Uniapp 中的 px 与 rpx
前端·css·vue.js·uni-app·html
狂团商城小师妹43 分钟前
智慧废品回收小程序php+uniapp
大数据·微信·微信小程序·小程序·uni-app·微信公众平台
Ama_tor1 小时前
网页制作06-html,css,javascript初认识のhtml如何建立超链接
javascript·css·html
木亦Sam1 小时前
响应式网页设计中媒体查询的进阶运用
前端·响应式设计
diemeng11191 小时前
2024系统编程语言风云变幻:Rust持续领跑,Zig与Ada异军突起
开发语言·前端·后端·rust
烂蜻蜓1 小时前
Uniapp 中布局魔法:display 属性
前端·javascript·css·vue.js·uni-app·html
视觉CG1 小时前
【Viewer.js】vue3封装图片查看器
开发语言·javascript·vue.js
java1234_小锋2 小时前
一周学会Flask3 Python Web开发-redirect重定向
前端·python·flask·flask3
琑952 小时前
nextjs项目搭建——头部导航
开发语言·前端·javascript