Promise实现子组件的多表单校验并反馈结果给父组件
全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11529207.html,多谢,=。=~
本文中多表单验证主要用到Promise.all()实现多任务并行,关于Promise可以看我之前写的https://www.cnblogs.com/dreamsqin/p/10959411.html,这里不再单独说明~
先画个图看看整个组件+表单的结构(本文列举4个子组件、子组件中4个子表单为例,更多的同理):

F.vue:父组件,做表单的统一验证和提交;
X.vue:子组件,单独做表单验证,验证通过则提交表单数据给父组件;
formX:子组件中表单绑定的model变量,通常所有子表单绑定在这一个表单变量上;
form_xn:子表单的ref;
注:本文中表单验证基于Element-ui实现(采用ref+validate方法实现,但整体框架具备通用性)
一、Promise实例生成
首先需要一个根据ref动态生成Promise实例(可以理解为后面需要并行的任务)的公共方法:
// 根据表单ref,动态生成Promise,参数传递ref的name数组
formPromiseArray(vm, formName) {
let promiseArray = []
for (var i in formName) {
let promise = new Promise(function(resolve, reject) {
vm.$refs[formName[i]].validate((valid) => {
if (valid) {
resolve()
} else {
reject(new Error())
}
})
})
promiseArray.push(promise)
}
return promiseArray
}
二、子组件表单校验
在子组件中利用Promise.all实现多个子表单并行校验,只有当所有子表单均通过验证时才给valid变量赋值为true:
// 表单验证
async validateForm() {
let vm = this
let promiseArray = util.formPromiseArray(vm, ['form_a1', ' form_a2', ' form_a3', ' form_a4'])
await Promise.all(promiseArray).then(() => {
vm.valid = true
}).catch(() => {
vm.valid = false
})
}
三、提交表单数据给父组件
当子组件表单校验通过后,将最新的表单数据对象返回给父组件:
// 用于父组件触发,传递最新表单数据
async submitForm() {
await this.validateForm()
if (this.valid) {
let form = _.cloneDeep(this.formA)
return form
}
}
四、父组件获取子组件的表单数据
父组件提交保存请求前校验子组件表单,当校验通过时获取子组件表单数据(父组件中子组件ref为child,通过调用子组件方法获取表单数据):
// 获取最新表单数据并封装成对象,根据是否返回对象确定校验是否通过
async submitForm() {
let form = {
recordId: this.recordId
}
let vm = this
await this.$refs.child.submitForm().then(obj => {
vm.isPassA = !!obj
if (obj) {
form.formAData = _.cloneDeep(obj)
}
})
return form
}
五、父组件提交保存请求
当所有表单校验通过时才提交保存:
// 保存处理进度
save () {
let vm = this
this.submitForm().then((form) => {
if (vm.isPassA && vm.isPassB && vm. isPassC && vm. isPassD) {
// 提交保存请求
} else {
vm.$message.info('请检查信息格式')
}
})
}
至此,整个多表单验证就完成了,在父组件中还可以根据子组件返回的校验结果设置子组件表单未通过验证的样式,例如小红点标识。
注:本文中大量使用到了async及await,将会在下一篇博客中详细说明。
Promise实现子组件的多表单校验并反馈结果给父组件的更多相关文章
- Vee-validate 父组件获取子组件表单校验结果
vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...
- 利用jquery.validate以及bootstrap的tooltip开发气泡式的表单校验组件
表单校验是页面开发中非常常见的一类需求,相信每个前端开发人员都有这方面的经验.网上有很多成熟的表单校验框架,虽然按照它们默认的设计,用起来没有多大的问题,但是在实际工作中,表单校验有可能有比较复杂的个 ...
- day75 form 组件(对form表单进行输入值校验的一种方式)
我们的组件是什么呢 select distinct(id,title,price) from book ORM: model.py class Book(): title=model.CharFiel ...
- [Swift通天遁地]二、表格表单-(17)制作在表单左侧添加单选和复选组件的表单行
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Element-ui中为上传组件添加表单校验
vue所依赖的Element的UI库在使用其中的upload组件时,可能很大几率会遇到这个题,需要给upload组件添加表单校验 大家这里直接看代码就可以 <el-form-item class ...
- 【Flutter学习】基本组件之基本表单组件
一,概述 表单时一个包含表单元素的区域. 表单元素允许用户输入内容,比如文本域,下拉列表,单选框,复选框等.常见的应用场景有:登录,注册,输入信息等. 表单里有两个重要的组件: Form:用来做整个表 ...
- vue.js基础知识篇(7):表单校验详解
目录 网盘 第12章:表单校验 1.npm安装vue-validator $ npm install vue-validator 代码示例: var Vue=require("vue&quo ...
- 【转】vue.js表单校验详解
官方文档:https://monterail.github.io/vuelidate/ https://github.com/monterail/vuelidate 1.npm安装vue-valida ...
- iview form表单数值类型校验「iview自定义form表单校验器」
摘录iview表单验证 Form 组件基于 sync-validator 实现的数据验证,给 Form 设置属性 rules,同时给需要验证的 FormItem 设置属性 prop 指向对应字段即可. ...
随机推荐
- Python 之configparser读取配置操作类
一.为什么要封装 我们为什么要封装,我相信你们在项目开发过程中深有体会,那么这个读取配置工具类,又是为了什么? 为了项目参数配置的灵活性,不要改动到源码 为了信息的安全(一定层面的),体现代码重用性 ...
- JavaWeb 文件的上传、下载
文件上传 表单 <form action="HandlerServlet" method="post" enctype="multipart/f ...
- .net web mvc 权限验证
这里分享MVC的权限验证,内容中可能存在一些,莫名其妙的方法,那些是以前封装好的,大致可以根据方法名称知道他的意思. using Game.Entity; using Game.Entity.Plat ...
- cmake设定boost python3
在mac上操作的.python3是anaconda环境下装的,3.7.1. boost是用brew装的,1.71.0版本. 按照FindBoost.cmake官方写法的CMakeLists.txt: ...
- Eclipse调用Tomcat出错
错误提示:The server cannot be started because one or more of the ports are invalid. Open the server edit ...
- destoon聚合搜索页面模板
最近学习大型站点SEO策略,谈到关于大站需要做聚合页面tags,所以根据destoon系统自己做了一个聚合页面,在此分享给吾爱的朋友,一起学习参考! 模板演示站点:http://zhimo.yuanz ...
- Oracle存储过程常用语法及其使用
1.什么是存储过程 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行.它可以接受参数.输出参数,并可以返回单个或多个 ...
- Checkout 显示 URL /../../.. 不存在
Checkout 显示 URL /../../.. 不存在 Checkout 显示 URL /../../.. 不存在 如果库的路径是 svn库的路径为:/usr/local/svn/test/ 启动 ...
- mybatis框架,使用foreach实现复杂结果的查询--循环List集合方式
需求,根据用户角色列表 查询用户列表信息 之前我们传入的参数是Array,一个数组的形式,现在我们传入的是一个List集合,其他条件没有变化. /** * 需求:传入指定的用户角色,用户角色有1-n ...
- #pragma once用法总结
1.#pragmaonce这个宏有什么作用? 为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式:另一种是#pragma once方式. 在能够支 ...