全手打原创,转载请标明出处: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实现子组件的多表单校验并反馈结果给父组件的更多相关文章

  1. Vee-validate 父组件获取子组件表单校验结果

    vee-validate 是为 Vue.js 量身打造的表单校验框架,允许您校验输入的内容并显示对应的错误提示信息.它内置了很多常见的校验规则,可以组合使用多种校验规则,大部分场景只需要配置就能实现开 ...

  2. 利用jquery.validate以及bootstrap的tooltip开发气泡式的表单校验组件

    表单校验是页面开发中非常常见的一类需求,相信每个前端开发人员都有这方面的经验.网上有很多成熟的表单校验框架,虽然按照它们默认的设计,用起来没有多大的问题,但是在实际工作中,表单校验有可能有比较复杂的个 ...

  3. day75 form 组件(对form表单进行输入值校验的一种方式)

    我们的组件是什么呢 select distinct(id,title,price) from book ORM: model.py class Book(): title=model.CharFiel ...

  4. [Swift通天遁地]二、表格表单-(17)制作在表单左侧添加单选和复选组件的表单行

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. Element-ui中为上传组件添加表单校验

    vue所依赖的Element的UI库在使用其中的upload组件时,可能很大几率会遇到这个题,需要给upload组件添加表单校验 大家这里直接看代码就可以 <el-form-item class ...

  6. 【Flutter学习】基本组件之基本表单组件

    一,概述 表单时一个包含表单元素的区域. 表单元素允许用户输入内容,比如文本域,下拉列表,单选框,复选框等.常见的应用场景有:登录,注册,输入信息等. 表单里有两个重要的组件: Form:用来做整个表 ...

  7. vue.js基础知识篇(7):表单校验详解

    目录 网盘 第12章:表单校验 1.npm安装vue-validator $ npm install vue-validator 代码示例: var Vue=require("vue&quo ...

  8. 【转】vue.js表单校验详解

    官方文档:https://monterail.github.io/vuelidate/ https://github.com/monterail/vuelidate 1.npm安装vue-valida ...

  9. iview form表单数值类型校验「iview自定义form表单校验器」

    摘录iview表单验证 Form 组件基于 sync-validator 实现的数据验证,给 Form 设置属性 rules,同时给需要验证的 FormItem 设置属性 prop 指向对应字段即可. ...

随机推荐

  1. 藏红花StigmaCroci西红花StigmaCroci番红花

    伊朗藏红花(StigmaCroci)是一种耐旱植物,适于生长在冬季最低气温不低于零下20度,夏季最高气温不高于零上35度且气候干燥的地区. 因其水土和气候条件的限制,除了伊朗能大量种植外,希腊.印度. ...

  2. Prometheus(一):Prometheus+Grafana 安装配置

    一.基础环境 系统 IP 监控主机 CentOS 7 192.168.56.200 被监控主机 CentOS 7 192.168.56.201 二.Prometheus服务端安装 以下操作皆在监控主机 ...

  3. 10年前错过比特币,如今有斯坦福区块链项目pi币,对标btc,手机免费挖矿详细教程。

    这一个斯坦福几个博士创业者做一个项目,目前还处于早期阶段,除了每天点一下挖矿之外,貌似不需要其他的操作,不需要耗费流量资源和手机大量的运算能力,就是一个安静的App而已....国内目前知道的人还不太多 ...

  4. linux常见性能分析工具

     vmstat    sar  (来源于sysstat工具包,需要yum  sysstat)iostat  (来源于sysstat工具包,需要yum  sysstat)free  -muptimene ...

  5. offsetWidth的bug

    #div1{width:200px;border:1px solid red;} 这个时候如果用 offsetWidth 提取 #div1 的宽  得到的值是 202: 也就是说 offsetWidt ...

  6. USACO Milk Routing

    洛谷 P3063 [USACO12DEC]牛奶的路由Milk Routing 洛谷传送门 JDOJ 2334: USACO 2012 Dec Silver 3.Milk Routing JDOJ传送门 ...

  7. USACO Protecting the Flowers

    洛谷 P2878 [USACO07JAN]保护花朵Protecting the Flowers 洛谷传送门 JDOJ 1009: 护花 JDOJ传送门 Description FJ出去砍木材去了,把N ...

  8. opencv获取网络相机的图像-不用sdk

    海康相机 优点:不用sdk直接网络获取 缺点:速度有1-2秒的延迟 使用型号 1280*680分辨路 #include <iostream> #include<opencv2/ope ...

  9. Spring Boot 知识笔记(热部署)

    热部署原理: 使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader ...

  10. vue中使用element-ui自定义主题后,vue-cli跑不起来了

    环境:vue-cli 2.x版本 自己在官网配置了主题并放到了项目中https://element.eleme.cn/#/zh-CN/theme 然后,我的脚手架在我的电脑中休息了几天,就跑不通了呢! ...