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 指向对应字段即可. ...
随机推荐
- 英语cowbezoar牛黄cowbezoar单词
牛黄(cowbezoar)是脊索动物门哺乳纲牛科动物牛胆囊的胆结石.在胆囊中产生的称“胆黄”或“蛋黄”,在胆管中产生的称“管黄”,在肝管中产生的称“肝黄”. 中文学名牛黄 拉丁学名Bos taurus ...
- 通过SOFA看Java服务端如何实现运行时的模块化
本文阅读时间大约7分钟. 今天我们谈谈SOFA模块化,首先看一段SOFA的介绍: SOFABoot是蚂蚁金服开源的基于Spring Boot的研发框架,它在Spring Boot的基础上,提供了诸如 ...
- 【爬虫】网页抓包工具--Fiddler--Request和Response
[爬虫]网页抓包工具--Fiddler Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888, ...
- MySQL数据库(二)--库相关操作、表相关操作(1)、存储引擎、数据类型
一.库相关操作 1.创建数据库 (1)语法 create database 数据库 charset utf8; (2)数据库命名规范 可以由字母.数字.下划线.@.#.$ 区分大小写 唯一性 不能使用 ...
- 【Android】【问题解决记录】Error obtaining UI hierarchy :Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!
在使用uiautomatorviewer时遇到两类Error obtaining UI hierarchy报错,分别是: Error while obtaining UI hierarchy XML ...
- Fiddler抓包设置
介绍 Fiddler 在 PC 端和移动端,模拟器抓取数据包 Fiddler抓取PC端数据包: 这里 Fiddler 抓取网页客户端的数据包时,其原理就是在 客户端/浏览器 和 服务器端 之间,加上了 ...
- 第02节-BLE协议各层的形象化理解
本篇博客根据韦大仙视频,整理所得. 先上框图: ATT层 从ATT开始看,在上篇博客讲的医院结构里面有个检验室,检验室可以得到各项结果,但是它并不知道这些结果代表什么含义.类比的在BLE协议栈里面,A ...
- CSP 201812-2 小明放学
问题描述: 解题思路: 由于数据的量较大,需要使用long long来存储结果,否则会爆掉结果只能得到一部分的分 可以类比时钟,将红绿灯的变换当成时钟的运转,这样用模运算来断定红绿灯在到达时处于什么颜 ...
- JMeter基础【第三篇】JMeter5.1元件作用域及执行顺序
执行顺序,大家可以实践验证,加深印象. 最后,给大家说一个万能且保险的方法:放到对应的取样器下面即可.
- MySql数据库中的datediff函数
MySql数据库中的datediff函数:主要是用来返回两个日期之间相隔的天数 一半情况下是大日期在前,小日期在后的 这样写也是能够运行的 要注意查询结果: