单页面内循环遍历的多个表单做校验(ui框架:elementui + uview)

这篇具有很好参考价值的文章主要介绍了单页面内循环遍历的多个表单做校验(ui框架:elementui + uview)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

业务需求描述

界面展示:
单页面内循环遍历的多个表单做校验(ui框架:elementui + uview)
单页面内循环遍历的多个表单做校验(ui框架:elementui + uview)用户每次在【物资扫码】成功后,都会在右侧【物资列表】中增加一个如图的结构(分为上中下三部分,上为【物资编号】,中为表格展示的物资基本信息,下为用户需要填写的表单项【本次组盘数】),需要在用户点击【保存】时,校验每一个表单项必填且数量大于1。

所用技术描述

客户要求该界面支持双端(网页端 + 移动设备端)
网页端采用:vue+elementui
移动设备端采用:uniapp+uview

网页端(vue+elementui)实现方式及具体代码

界面左侧就是简单的点击事件不做赘述,重点讲右侧的表单校验。

<el-col :span="18">
    <div class="main_div">
        <div class="table_item" v-for="(item,index) in tableData" :key="index">
            <div class="materials_div">
                <div class="materials_code">{{index + 1}} | 批次号:{{item.batchNum}}</div>
            </div>
            <div class="table_div">
                <div style="width:91%">
                		<!-- el-table组件接收一个数组,而tableData是一个对象数组,所以此处将遍历得到得对象转变为一个数组赋值给组件 -->
                		<!-- 此处可以写[tableData[index]] 也可以写 [item],效果是一样的 -->
                    	<el-table 
	                         v-loading="loading" 
	                         :data="[tableData[index]]" 
	                         border 
	                         highlight-current-row
	                     >
                         <el-table-column label="物资类别" align="center" prop="materialsTypeName" />
                         <el-table-column label="物资名称" align="center" prop="materialsName" />
                         <el-table-column label="规格" align="center" prop="specs" />
                         <el-table-column label="数量" align="center" prop="repertoryNum" />
                         <el-table-column label="待组盘数量" align="center" prop="discNum" />
                         <el-table-column label="所属仓库" align="center" prop="storeId" :formatter="storeIdFormat" />
                         <el-table-column label="所属库区" align="center" prop="reserveId" :formatter="reserveIdFormat" />
                         <el-table-column label="备注" align="center" prop="remark" />
                     </el-table>
                </div>
                <div class="delte_btn" @click="deleteHandle(item,index)">删除</div>
            </div>
            <!-- el-form表单接收一个数组,即遍历得到的tableData[index] -->
            <!-- 表单校验规则比较简单,我选择了写在行内的形式 -->
            <el-form class="form" ref="materialsManageForm" :model="tableData[index]">
               <el-form-item label="本次组盘数" prop="thisNum"
                   :rules="{
                       required: true, message: '本次组盘数不能为空', trigger: 'blur'
                   }"
               >
                   <el-input-number 
                       v-model="tableData[index].thisNum"
                       :min="1"
                   >
                   </el-input-number>
               </el-form-item>
           </el-form>
        </div>
    </div>
    <div class="save_btn" @click="submitForm">保存</div>
</el-col>
export default {
    data() {
        return {
            // 组盘数据,是一个对象数组,数据通过用户扫码得到的编号访问后台得到,大致就是=>[{},{}]
            tableData:[],
        };
    },
    methods:{
		// 保存
        submitForm() {
       		//flag为表单校验是否成功的标志变量
            var flag = true;
            //当一个页面有多个refs 为 materialsManageForm 的表单时,
            //this.$refs["materialsManageForm"]会得到一个数组,于是遍历这个数组,去校验每一个表单是否符合校验规则
            this.$refs["materialsManageForm"].forEach(ii=>{
                ii.validate((valid) => {
                    if (valid) {
                        //校验成功,不对flag做操作
                    } else {
                    		//一旦有一个表单不符合校验规则,将flag设置为false
                        flag = false;
                        console.log('error submit!!');
                        return false;
                    }
                });
            })
            if(flag){
                //校验成功,访问后台做保存数据等操作
            }else{
                //校验失败,此时界面上已经会有elemnt自带的提示
                //可不做操作,也可提示用户,也可做后续操作
            }
        }
	}
}

移动端(uniapp+uview)实现方式及具体代码

同样只讲右侧的表单校验。

<view class="right_view">
	<view class="main_div">
		<view class="table_item" v-for="(item,index) in tableData" :key="index">
			<view class="materials_div">
				<view class="materials_code">{{index + 1}} | 物资编号:{{item.materialsCode}}</view>
			</view>
			<view class="table_div">
				<view style="width:91%">
					<!-- 此处的表格并非uview中自带的组件,需要从uniapp插件市场导入项目 -->
					<!-- uniapp官网相关介绍 => https://uniapp.dcloud.net.cn/component/uniui/uni-table.html#%E4%BB%8B%E7%BB%8D -->
					<!-- uni-table组件地址 =>  https://ext.dcloud.net.cn/plugin?name=uni-table -->
					<uni-table border stripe emptyText="暂无更多数据">
						<!-- 表头行 -->
						<uni-tr>
							<uni-th align="center">物资类别</uni-th>
							<uni-th align="center">物资名称</uni-th>
							<uni-th align="center">规格</uni-th>
							<uni-th align="center">数量</uni-th>
							<uni-th align="center">待组盘数量</uni-th>
							<uni-th align="center">所属仓库</uni-th>
							<uni-th align="center">所属库区</uni-th>
							<uni-th align="center">备注</uni-th>
						</uni-tr>
						<!-- 表格数据行 -->
						<uni-tr v-for="(ite, ind) in [item]" :key="ind">
							<uni-td align="center">{{ite.materialsTypeName}}</uni-td>
							<uni-td align="center">{{ite.materialsName}}</uni-td>
							<uni-td align="center">{{ite.specs}}</uni-td>
							<uni-td align="center">{{ite.repertoryNum}}</uni-td>
							<uni-td align="center">{{ite.discNum}}</uni-td>
							<uni-td align="center">{{storeIdFormat(ite)}}</uni-td>
							<uni-td align="center">{{reserveIdFormat(ite)}}</uni-td>
							<uni-td align="center">{{ite.remark}}</uni-td>
						</uni-tr>
					</uni-table>
				</view>
				<view class="delte_btn" @click="deleteHandle(item,index)">删除</view>
			</view>
			<u--form errorType="toast" ref="materialsManageForm" :model="tableData[index]"
				labelWidth="auto">
				<u-form-item label="本次组盘数" prop="thisNum">
					<u-number-box v-model="tableData[index].thisNum" integer :min="1"
						></u-number-box>
				</u-form-item>
			</u--form>
		</view>
	</view>
	<view class="save_btn" @click="submitForm">保存</view>
</view>
export default {
    data() {
        return {
            // 组盘数据,是一个对象数组,数据通过用户扫码得到的编号访问后台得到,大致就是=>[{},{}]
            tableData:[],
            //表单项校验是否成功的标志属性,因为uview用了promise方式进行校验,所以此处得把formFlag定义在这里
            formFlag:true
        };
    },
    methods:{
    	//此处为用户扫码后向右侧新增一个物料的方法,uniapp和element不同,uniapp需要手动给表单添加校验规则,故此把这个方法写出来,
    	//访问后台过程有所简略,重点是向tableData push一个新的对象时,对象中必须有要校验的表单项属性,
    	//该例子中为【thisNum】。如果没有该属性,控制台会报错
    	newRow() {
			var _this = this;
			this.tableData.push({
				thisNum: 0
			});
			//给materialsManageForm添加规则时,节点必须已经挂载完毕,所以用了setTimeout。目前没想到更好的办法,等以后想到了再回来补充
			setTimeout(() => {
				_this.$refs["materialsManageForm"].forEach(ii => {
					ii.setRules(_this.formRules)
				})
			}, 1000)
		},
		//uview采用了promise方式对表单进行校验,所以就不能再使用简单的forEach,因为我们需要等待所有的表单都校验完毕,再去获取flag
		//此处为达到这个效果,用了new Promise的办法
		checkFormValid() {
			this.formFlag = true;
			return new Promise((resolve, reject) => {
				let list = [];
				this.$refs["materialsManageForm"].forEach(ii => {
					const p = new Promise((reso, rej) => {
						ii.validate().then(res => {
							// 校验通过,this.formFlag值不变
						}).catch(errors => {
							// 有校验不通过的,this.formFlag值为false
							this.formFlag = false;
						}).finally(() => {
							reso(); //单个接口执行完毕
						})
					})
					list.push(p)
				})
				Promise.all(list).then(result => {
					resolve() //所有接口都执行完毕
				})
			})
		},
		// 保存
		submitForm() {
			var _this = this;
			this.checkFormValid().then(res => {
				if (_this.formFlag) {
					//表单校验成功,访问后台做保存数据等操作
				}
			})
		}}
}

以上就是两种框架校验的具体过程了,此博文重点在分享完成需求的方法和思路,所以如果因为省略了很多中间代码,在复制过程中有所遗漏导致代码不能粘贴即用,还望读者见谅。文章来源地址https://www.toymoban.com/news/detail-509559.html

到了这里,关于单页面内循环遍历的多个表单做校验(ui框架:elementui + uview)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • for循环遍历的`form表单组件`rules规则校验失效问题——下拉框选择之后还是报红---亲测有效

    问题:   大概的效果就是这种, for循环选择之后还是还是报红 看文章之前 :  先检查  model  rules pops 有没有判定好 解决:    参考了他的 for循环遍历的`form表单组件`rules规则校验失效问题——输入内容后依然提示必填,亲测有效——基础积累_a-form-model的validatefield方法循环遍

    2024年02月07日
    浏览(30)
  • element ui中下拉框设置了多选multiple之后 一进页面就触发表单校验

    场景描述: 新增页面使用el-select multiple下拉多选控件,并设置了非空校验,打开页面时,下拉多选控件会自动触发表单非空校验,如图: 解决方法 1.页面初始化时,设置当前属性初始值为空数组 2.使用钩子函数,在创建页面时,重置对应属性的值 注: _self.form对象为上述第一

    2024年02月01日
    浏览(27)
  • elementUI 非表单格式的校验

     在普通表单中对输入框、选择框都有校验案例。 但是在自定义非空中如何进行校验官网并没有说明 关键代码 clearValidate 方法清除校验 使用案例

    2024年02月16日
    浏览(36)
  • elementUI 动态校验表单数据的方法

    直接设置如下 list 为动态获取的数据值列表数据 这里主要设置两块内容 prop为动态数据 rules设置需要校验的值 :prop=“ list.${index}.title ” :rules=“rules.title” //title 名称可自己定义

    2024年02月21日
    浏览(29)
  • ElementUI 实现动态表单数据校验(已解决)

    大家好很久没有更新文章了,本片文章主要记录一下遇到的问题, 使用element-ui开发,el-form 表单验证,由于表单的每一项是后端返回动态渲染的,之前只写过静态的表单验证,网上查了一些资料和element的官方文档最后得已解决,记录下来分享给大家。 感兴趣的小伙伴可以学

    2024年02月14日
    浏览(31)
  • 解决ElementUI动态表单校验验证不通过

    这里记录一下,写项目时遇到的一个问题:就是动态渲染的表单项,加验证规则后一直不通过!!! html部分:  js部分: 结果:   可以看到,按照官网的写法动态渲染的表单项是无法进行校验验证的。这里就是无论选中没选中值都校验 不通过。 修改prop、rules 结果:

    2024年02月12日
    浏览(24)
  • vue表单及遍历表单校验rules以及validator校验器的使用

    为防止用户犯错,尽可能更早地发现并纠正错误。 Element中Form (表单)组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可。 注意:prop对应表单域 model 字段,使用 validate方法时,该属性是必填的。 目

    2024年02月08日
    浏览(32)
  • elementui 表单数据嵌套过深导致校验不了问题解决

    在使用 elementui 表单校验的过程中发现表单中存在嵌套多个层级的数据不能进行校验。 elementui 中如果需要进行表单校验,表单项的 prop 和 v-model 绑定的属性值命名必须要是相同的。而对于多层级的嵌套属性我们应该怎么表示呢? 只需要将表单对象后的字符串作为 prop 的值即

    2024年01月24日
    浏览(38)
  • form 校验多个表单

    有的时候,表单需要拆开多个,这时候就需要校验多个表单  

    2024年02月16日
    浏览(33)
  • vue中elementUI表单循环验证

    进行验证的步骤

    2024年02月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包