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 指向对应字段即可. ...
随机推荐
- Windows实时预览markdown
1.安装Notepad++ 2.打开Notepad++菜单栏的"插件(P)",然后打开"插件管理" 3.搜索"MarkdownViewer++&quo ...
- 我是这样手写Spring的,麻雀虽小五脏俱全
人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...
- Nginx 核心配置-location的匹配案例实战篇
Nginx 核心配置-location的匹配案例实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.location语法规则介绍 在没有使用正则表达式的时候,nginx会先在 ...
- soeasy的键盘鼠标事件
在web自动化中,我们可能会遇到需要通过键盘或者鼠标去操作某些元素,那么我们就需要用到键盘事件和鼠标事件了,今天对键盘和鼠标操作进行一个总结 鼠标事件 鼠标事件需要引入ActionChains类,查看 ...
- WebVTT字幕格式
[时间:2019-05] [状态:Open] [关键词:字幕,vtt,webvtt, 文件格式,cue,css] 0 引言 WebVTT(Web Video Text Tracks),通过HTML5中 ...
- 四步理解GloVe!(附代码实现)
1. 说说GloVe 正如GloVe论文的标题而言,GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & ...
- asp.net core mvc基于Redis实现分布式锁,C# WebApi接口防止高并发重复请求,分布式锁的接口幂等性实现
使用背景:在使用app或者pc网页时,可能由于网络原因,api接口可能被前端调用一个接口重复2次的情况,但是请求内容是一样的.这样在同一个短暂的时间内,就会有两个相同请求,而程序只希望处理第一个请求, ...
- Celery详解(1)
在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是 ...
- Hive 问题
hive 重启连接不上 异常信息: FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache ...
- 201871010101-陈来弟《面向对象程序设计(java)》第二周学习总结
201871010101-陈来弟<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs ...