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 指向对应字段即可. ...
随机推荐
- 浅聊标签<include>和<viewStub>
在开发中我们往往会遇到这种情况,当一个布局文件比较复杂时,我们一个劲地往里面拖各种控件button,textView,imageView阿等等,等过了一段时间后,出现bug,自己都把自己搞懵比啦,特别 ...
- Hashtable,HashMap和ConcurrentHashMap的原理及区别
一.原理 Hashtable 底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashM ...
- Candies POJ - 3159
题目链接:https://vjudge.net/problem/POJ-3159 思路: 能看出是差分约束的题, 我们想假设一个人是 p(1),另一个人是p(2),他们之间糖果差为w, 那么需要满足的 ...
- CNN是怎样一步步工作的?
非常形象详细的博客:链接1 链接2 为了完成我们的卷积,我们不断地重复着上述过程,将feature和图中每一块进行卷积操作.最后通过每一个feature的卷积操作,我们会得到一个新的二维数组.这也可以 ...
- reactnative遇到的问题总结
1.View中出现文本报错,View等标签中不能出现字符串文本,字符串文本需要包在Text中,遇到如下错误 下面是问题代码: let rightTitle = this.props.rightTitl ...
- hdu6222——佩尔方程&&大数__int128
题意 给定一个整数 $N$($1 \leq N \leq 10^{30}$),求最小的整数 $t$,要求 $t \geq N$,使得边长为 $t-1, t, t+1$ 的三角形面积为整数. 分析 根据 ...
- P1908 逆序对-(cdq分治)
https://www.luogu.org/problem/P1908 沿用归并排序的思想求逆序对. 坑1:结果爆int型,需要用longlong 坑2:相对于归并排序,在比较的时候多了一个等号 举例 ...
- django运行报错TypeError: object supporting the buffer API required
运行django项目报错:TypeError: object supporting the buffer API required 解决方案: 将settings.py中数据库的密码改成字符串格式 源 ...
- OpenResty: 反向代理
打开文件 注:我配置的是 443 <--> 8083 以下域名根据自己的修改 请自行重启,测试.
- 洛谷p1776宝物筛选
宝物筛选 多重背包问题 物品数目已知 可以枚举每个物品 当做01背包来做 不过会超时 此时需要二进制拆分来优化 分解成新的物品 再跑一遍01背包即可 //二进制拆分+01背包 //设f[j]表示前i件 ...