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-form
        ref="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>

目录
相关文章
|
4月前
|
API UED 容器
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
在这篇博客中,我们将深入探讨 Element UI 中的自定义滚动条及弹出层管理技巧。文章详细介绍了 el-scrollbar 组件的使用和参数设置,以及 PopupManager 如何有效管理弹出层的 z-index。我们还将探讨如何实现灵活的全屏组件,利用 vue-popper 创建自定义弹出层,最后介绍 ClickOutside 指令的用法。这些高级技巧将帮助你提升 Element UI 应用程序的用户体验与交互灵活性。
487 1
深入探索 Element UI:自定义滚动条与弹出层管理的技巧
|
4月前
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
313 0
|
6月前
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
149 0
|
6月前
|
JavaScript 前端开发 开发者
决战前端之巅!Element UI与Vuetify谁才是Vue.js组件界的霸主?一场关于颜值与实力的较量!
【8月更文挑战第30天】本文对比了两款热门的Vue.js组件库——Element UI与Vuetify。Element UI由饿了么团队打造,提供多种高质量UI组件,设计简洁大方。Vuetify基于Material Design规范,支持Vue.js 2.0及3.0版本,具备前瞻性。两者均涵盖表单、导航、数据展示等组件,Element UI配置选项丰富,而Vuetify则提供了更深层的样式定制功能。开发者可根据项目需求及个人偏好选择合适的组件库。
472 0
|
9天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
137 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
3月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
4月前
|
开发框架 JavaScript 前端开发
鸿蒙NEXT开发声明式UI是咋回事?
【10月更文挑战第15天】鸿蒙NEXT的声明式UI基于ArkTS,提供高效简洁的开发体验。ArkTS扩展了TypeScript,支持声明式UI描述、自定义组件及状态管理。ArkUI框架则提供了丰富的组件、布局计算和动画能力。开发者仅需关注数据变化,UI将自动更新,简化了开发流程。此外,其前后端分层设计与编译时优化确保了高性能运行,利于生态发展。通过组件创建、状态管理和渲染控制等方式,开发者能快速构建高质量的鸿蒙应用。
221 3
|
2月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
1319 1
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
2月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
3月前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
195 8

热门文章

最新文章