Element UI 一键校验多表单(v-for循环表单,异步校验规则,v-for 中的 ref 属性,避坑 forEach 不支持异步 await )

本文主要是介绍Element UI 一键校验多表单(v-for循环表单,异步校验规则,v-for 中的 ref 属性,避坑 forEach 不支持异步 await ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求描述

  • 表单为数组 v-for 循环得到的多表单,如可自由增删的动态表单
  • 表单中存在异步校验规则,如姓名需访问接口校验是否已存在
  • 点击提交按钮,需一键校验所有表单,仅当所有表单都通过校验,才能最终提交到后台

效果预览

在这里插入图片描述

技术要点

  • 校验规则 rules 可复用,编写一套即可

异步校验规则的写法

let checkName = (rule, value, callback) => {axios({method: "get",url: "https://jsonplaceholder.typicode.com/posts",params: {userId: value,},}).then((res) => {if (res.data.length) {return callback(new Error("已存在"));} else {return callback();}});
};

此处的接口是公共的免费接口,仅模拟效果,不必深究传参和返回

formRules: {name: [{ required: true, trigger: "blur", message: "请输入姓名" },{ validator: checkName, trigger: "blur" },],
},

v-for 中的 ref 属性用静态字符串

通常,若两个元素 ref 属性相同,通过 this.$refs 只能获取到最终的元素

    <p ref="p1">1</p><p ref="p1">2</p>
this.$refs.p1  // 获取到的是 <p>2</p>

但在 v-for 中的 ref ,通过 this.$refs 得到的是一个数组

在这里插入图片描述
所以,此例中,获取第一个表单的方法是

this.$refs.formRef[0]

forEach中使用 await 无效!

forEach 只支持同步,不支持异步
所以此例多表单的校验需改用 for 循环,通过 break 还可提前跳出 for 循环

添加 try catch 捕获 await 中的报错

  • 添加 try catch 可避免控制台报错,同时避免报错阻塞代码的执行,可提升用户体验。
  • 给每一个await 都添加 try catch ,可在 catch 中可获知具体是哪一个表单校验失败!

代码实现

<template><div style="padding: 30px; width: 300px"><div v-for="(formData, formIndex) in formList" :key="'form' + formIndex"><el-formref="formRef":model="formData":rules="formRules"label-width="110px"size="mini"status-icon><el-form-item :label="`表单 ${formIndex + 1} 的姓名`" prop="name"><el-input v-model="formData.name" placeholder="请输入"></el-input></el-form-item></el-form></div><el-button @click="submit">提交</el-button></div>
</template><script>
import axios from "axios";
export default {data() {let checkName = (rule, value, callback) => {axios({method: "get",url: "https://jsonplaceholder.typicode.com/posts",params: {userId: value,},}).then((res) => {if (res.data.length) {return callback(new Error("已存在"));} else {return callback();}});};return {formList: [{}, {}],formRules: {name: [{ required: true, trigger: "blur", message: "请输入姓名" },{ validator: checkName, trigger: "blur" },],},};},methods: {async submit() {let formRefList = this.$refs.formRef;let result = true;for (let index = 0; index < this.formList.length; index++) {try {await formRefList[index].validate();console.log(`${index + 1}个表单通过校验`);} catch (error) {console.log(`${index + 1}个表单校验失败`);result = false;break;}}if (result) {console.log(`所有表单通过校验`);} else {console.log(`存在表单校验失败`);}},},
};
</script>

这篇关于Element UI 一键校验多表单(v-for循环表单,异步校验规则,v-for 中的 ref 属性,避坑 forEach 不支持异步 await )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062705

相关文章

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务