当前位置: 首页 > article >正文

uniapp 单表、多级动态表单添加validateFunction自定义规则

uniapp 多级动态表单添加自定义规则

在uniapp制作小程序时,当涉及到需要设置validateFunction的校验规则时。可能遇到的问题

1、validateFunction不生效,没有触发
2、多层级表单怎么添加validateFunction自定义校验规则

本文将以单表单校验和多表单校验分类描述

单表单自定义规则校验

要注意的是:

1、去掉:rules=“rules”,因为表单再校验时validateFunction会不执行
2、本文中photoList是自定义组件,主要结构为数组,可按照自己的需求填写
3、须在onReady()内设置规则、

    <template>
           <uni-forms ref="baseForm" :modelValue="baseFormData" label-position="left" label-width="150rpx">
				<uni-forms-item label="现场拍照" required name="imageList">
						<photoList v-model="baseFormData.imageList" limit="9"></photoList>
					</uni-forms-item>
			</uni-forms>
			<u-button class="button" type="primary" shape="circle" @click="submit('baseForm')">提交</u-button>
</template>
<script>
export default {
       data() {
			return {
			dynamicRules: {
					imageList: {
						rules: [{
							required: true,
							errorMessage: '最少一张图片'
						}, {
							validateFunction: (rule, value, data, callback) => {
								// 异步需要返回 Promise 对象
								return new Promise((resolve, reject) => {
									setTimeout(() => {
										//按照自己的需要填写
									}, 500)
								})
							}
						}]
					},
			}
		}onReady() {
			/* 这里,我们通过refs拿到增加的内容,然后setRules */
			this.$refs.baseForm.setRules(this.dynamicRules)
		},
		methods:{
		     // 提交
			 submit(ref) {
				this.$refs[ref].validate().then(res => {
				}).catch(err => {
					this.$modal.alert(err[0].errorMessage)
				})
			},
		}
}
</script>

多层级表单规则校验

要注意的是:

1、多层级表单与单层级外部校验相同,不同的是需要在新增子项或者原表单中有子项遍历时,先渲染,后添加规则。
2、给子项uni-from-item组件添加ref用于判断校验位置。

<template>
           <uni-forms ref="baseForm" :modelValue="baseFormData" label-position="left" label-width="150rpx">
					<view v-for="(item,index) in baseFormData.inspectionCustodyWorkLogDetailBoList" :key='index'>
							<uni-forms-item label="照片" required :ref="'inspectionCustodyWorkLogDetailBoList-'+index"
								:rules="[{required: true,errorMessage: `检查${index+1}图片不能为空`
						}]" :name="['inspectionCustodyWorkLogDetailBoList',index,'imagelist']" label-width="100rpx">
								<view class="form-item">
									<photoList
										v-model="baseFormData.inspectionCustodyWorkLogDetailBoList[index].imagelist"
										limit="9"></photoList>
								</view>
							</uni-forms-item>
						</view>
					</view>
					<view >
					<u-button type="primary" icon="plus-square-fill" @click="add" plain
						:hairline="false">新增检查项</u-button>
				</view>
			</uni-forms>
			<u-button class="button" type="primary" shape="circle" @click="submit('baseForm')">提交</u-button>
</template>
<script>
export default {
       data() {
			return {
			baseFormData: {
					inspectionCustodyWorkLogDetailBoList: [], //检查记录
			},
			dynamicRules: {
			// 基础表单数据
					imageList: {
						rules: [{
							required: true,
							errorMessage: '最少一张图片'
						}, {
							validateFunction: (rule, value, data, callback) => {
								// 异步需要返回 Promise 对象
								return new Promise((resolve, reject) => {
									setTimeout(() => {
										//按照自己的需要填写
									}, 500)
								})
							}
						}]
					},
			}
		}onReady() {
			/* 这里,我们通过refs拿到增加的内容,然后setRules */
			this.$refs.baseForm.setRules(this.dynamicRules)
		},
		methods:{
		// 选择企业这是在父表单需获取子项时增加
			company(val) {
				if (val != undefined) {
					// 获取企业必检项这是举例
					this.mustDeal = [{checkContent:1,inspectionItemType:1,riskLocation:2},{checkContent:1,inspectionItemType:1,riskLocation:2}
					]
					//循环获取内容添加至表单中
					this.mustDeal.forEach((item, index) => {
			        	this.baseFormData.inspectionCustodyWorkLogDetailBoList.push({
							checkContent: item.checkContent,
							images: null,
							inspectionItemType: item.inspectionItemType,
							riskLocation: item.riskLocation,
							id: Date.now(),
							imagelist: [],
							isPass: null, //是否合格
							isMustCheck: 1,
						})
					})
					/* 这里,我们通过refs拿到增加的内容,然后setRules */
					this.$nextTick(() => {
						/* 用nextTick是让界面先渲染 */
						/* 根据html中的ref规则,获取到uni-forms-item */
						this.baseFormData.inspectionCustodyWorkLogDetailBoList.forEach((ite, inde) => {
							// 	// rules[`imagelist`]=this.dynamicRules.imagelist.rules
							let $Item = this.$refs['inspectionCustodyWorkLogDetailBoList-' + inde];
							/* 对这个uni-forms-item主动setRules */
							/* 这里直接设置的是对应字段的rules */
							$Item[0].setRules(this.dynamicRules.imagelist.rules);
						})
					})
				} 
			},
		// 新增检查项
			add() {
				this.baseFormData.inspectionCustodyWorkLogDetailBoList.push({
					checkContent: null,
					images: null,
					id: Date.now(),
					imagelist: [],
					isPass: null, //是否合格
					isMustCheck: 0, //非必检
				})
				/* 这里,我们通过refs拿到增加的内容,然后setRules */
				this.$nextTick(() => {
					/* 用nextTick是让界面先渲染 */
					/* 根据html中的ref规则,获取到uni-forms-item */
					let $Item = this.$refs['inspectionCustodyWorkLogDetailBoList-' + (this.baseFormData
						.inspectionCustodyWorkLogDetailBoList.length - 1)];
					/* 对这个uni-forms-item主动setRules */
					/* 这里直接设置的是对应字段的rules */
					$Item[0].setRules(this.dynamicRules.imagelist.rules);
				});
			},
		     // 提交
			 submit(ref) {
				this.$refs[ref].validate().then(res => {
				}).catch(err => {
				//输出报错信息
					this.$modal.alert(err[0].errorMessage)
				})
			},
		}
}
</script>
以上是本人工作中为解决问题使用,不足之处还望指出。

http://www.kler.cn/news/357421.html

相关文章:

  • Mybatis操作
  • Vue中v-bind对样式控制的增强—(详解v-bind操作class以及操作style属性,附有案例+代码)
  • Golang | Leetcode Golang题解之第479题最大回文数乘积
  • 测试用例评审流程优化
  • 智能时代摩托车一键启动无钥匙进入感受科技前线
  • 《计算机视觉》—— 基于dlib库的人检检测
  • C#从零开始学习(类型和引用)(4)
  • ARM 中断控制器 GIC-V2
  • Unity3D ScrollView 滚动视图组件详解及代码实现
  • 世界脑力锦标赛资料,最强大脑教程
  • 鸿蒙网络编程系列23-实现一个基于鸿蒙API的HTTP服务器
  • git的学习使用(搭建本地仓库,创建本地仓库,配置本地仓库)(附带Ubuntu云服务器git安装流程)
  • QShortcut实现快捷键
  • 数据结构与算法JavaScript描述练习------第12章排序算法
  • Python实时视频流+网络摄像头+视频检测流程播放
  • 知识付费小程序:轻松实现一站式运营,开启知识变现之旅
  • 安卓窗口wms/input小知识NO_INPUT_CHANNEL剖析
  • |人口分析|007_django基于Python的广东省人口流动数据分析2024_92306i61
  • 如何给SaaS应用做安全
  • Python 基础