Element-Plus如何实现表单校验和表单重置

news2024/11/21 2:34:36

一:页面布局介绍: 

这是我刚刚用基于vue3+element-plus写好的一个部门管理的页面

 基本的增删改查已经写好,下面我只提供页面的template和style的代码:

template

<template>
  <el-card class="box-card">
  <!-- 部门管理的头部 -->
  <div>
    <h1 style="margin-left: 20px;">部门管理</h1>
  </div>
  <!-- 部门管理的主体部分 -->
  <el-button type="primary" style="margin-left: 20px;" @click="addDeptDialog()">
    <el-icon><CirclePlus /></el-icon> &nbsp; 新增部门
  </el-button>
  <!-- 主体内容展示 -->
  <div class="form-box">
    <el-table :data="deptDate" border style="width: 100%">
    <el-table-column  prop="id" label="序号" width="120" align="center"/>
    <el-table-column prop="name" label="部门名称" width="240" align="center"/>
    <el-table-column prop="updateTime" label="最后操作时间" width="360" align="center"/>
    <el-table-column label="操作" align="center">
      <template #default="scope">
        <el-button type="primary" :icon="Edit" circle @click="updateDept(scope.row.id)" />
        <el-button type="danger" :icon="Delete" circle @click="delDept(scope.row.id)"/>
      </template>
    </el-table-column>
  </el-table>
  </div>
</el-card>

<!-- dialog弹窗 -->
<el-dialog v-model="dialogForValue" width="450px" :title="dialogTitle">
    <el-form :model="deptForm"
      >  
      <el-form-item label="部门名称" :label-width="formLabelWidth">
        <el-input v-model="deptForm.name" autocomplete="off" />
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogForValue = false">取消</el-button>
        <el-button type="primary" @click="save()">
          确认
        </el-button>
      </span>
    </template>
  </el-dialog>
</template>

style部分:

<style scoped>
.box-card{
  height: 700px;
}

.form-box{
  margin-top: 20px;
}
</style>

二:表单校验:

通过测试我们发现,在添加部门的时候,我不在输入框里面输入内容也是可以成功添加部门数据的,这显得就不太友好。

我直接点击确定:近发现数据已经添加成功了,这就有点不符合逻辑了。

开始表单校验:
  • 1,定义表单校验规则 绑定到form表单
  • 2,把规则绑定到form表单中
  • 3,定义表单组件的引用
  • 4,检验表单
定义表单校验实例:

完整规则代码:

//定义表单校验的规则  //FormRules 是element给我们提供的,可以给我们提示
const rules = ref<FormRules>({
  name:[
    {required:true,message:'部门名称不能为空',trigger:'blur'},
    {min:1,max:10,message:'部门名称必须 2 - 10位',trigger:'blur'}
  ]
})
规则绑定到表单中:

 

代码:

<el-dialog v-model="dialogForValue" width="450px" :title="dialogTitle">
    <el-form :model="deptForm"
    :rules="rules">  
      <el-form-item label="部门名称" :label-width="formLabelWidth" prop="name">
        <el-input v-model="deptForm.name" autocomplete="off" />
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogForValue = false">取消</el-button>
        <el-button type="primary" @click="save()">
          确认
        </el-button>
      </span>
    </template>
  </el-dialog>

看看效果:

 可以发现我们定义的校验规则已经生效了

但是规则虽然生效了,我们还是可以提交表单数据。 

我们因该在表单校验不通过的时候,阻止表单提交。

定义表单组件的引用:

代码:

//定义表单组件的引用  FormInstance 表单实例 是element给我们提供的
const deptFormRef = ref<FormInstance>()

 把这个表单组件的引用,绑定到我们自己的表单中。

代码:

<!-- dialog弹窗 ref="formRef 为了获取这个表单" -->
<el-dialog v-model="dialogForValue" width="450px" :title="dialogTitle">
    <el-form :model="deptForm"
    :rules="rules"
    ref="deptFormRef">  
      <el-form-item label="部门名称" :label-width="formLabelWidth" prop="name">
        <el-input v-model="deptForm.name" autocomplete="off" />
      </el-form-item>
    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogForValue = false">取消</el-button>
        <el-button type="primary" @click="save()">
          确认
        </el-button>
      </span>
    </template>
  </el-dialog>

在添加dialog弹窗里面,点击保存的时候,我们因该先判断表单校验是否通过,才能往下执行。

代码:

//确认保存
const save = async () =>{
 //先表单校验 
  await deptFormRef.value?.validate().catch(err =>{
    ElMessage.error('表单校验的失败')
    throw err   //throw err  //下面正常的代码就不会执行了,回抛出异常
  })
   
  //正式向后端发送请求
  let result 
  //判断是添加还是修改
  if(dialogTitle.value == '新增部门'){
    //添加的请求
    result = await insertDeptApi(deptForm.value)
  }else{
    //修改的请求
    result = await updateDeptApi(deptForm.value)
  }
    if(result.code){
        ElMessage.success('操作成功')
    }else{
      ElMessage.error('操作失败')
    }
    //关闭弹窗
    dialogForValue.value = false
    //重新查询
    search()
}

测试:

可以看到表单校验成功了

控制台报错:

不想提示报错还有另一种方式:

代码:

//确认保存
const save = async () =>{
 //先表单校验 
  await deptFormRef.value?.validate().catch(err =>{
    ElMessage.error('表单校验的失败')
    //throw err   //throw err  //下面正常的代码就不会执行了,回抛出异常
    return new Promise(() => {}) //不想抛错可以这样,promise是待定状态,也不会往下执行
  })
   
  //正式向后端发送请求
  let result 
  //判断是添加还是修改
  if(dialogTitle.value == '新增部门'){
    //添加的请求
    result = await insertDeptApi(deptForm.value)
  }else{
    //修改的请求
    result = await updateDeptApi(deptForm.value)
  }
    if(result.code){
        ElMessage.success('操作成功')
    }else{
      ElMessage.error('操作失败')
    }
    //关闭弹窗
    dialogForValue.value = false
    //重新查询
    search()
}

测试:

三:表单重置:

上面我们的表单校验已经成功了,但是我们会发现一个缺点就是,表单校验失败的提示信息一直都在。

我先把错误信息显示出来之后,然后关闭dialog弹窗,接着我在打开dialog弹窗,发现错误信息依然在。

定义表单重置的方法:

form是一会调用方法,传递过来的表单实例参数,就是一个变量名。后面的 FormInstance和undefined就是一个泛型。

代码:

//表单重置
const resetForm = (form : FormInstance | undefined) =>{
  if(!form) return
  form.resetFields()
}

在点击新增部门和修改部门的方法时,调用重置表单的方法。

代码:

  <el-button type="primary" style="margin-left: 20px;" @click="addDeptDialog();resetForm(deptFormRef)">
    <el-icon><CirclePlus /></el-icon> &nbsp; 新增部门
  </el-button>

代码:

    <el-table-column label="操作" align="center">
      <template #default="scope">
        <el-button type="primary" :icon="Edit" circle @click="updateDept(scope.row.id);resetForm(deptFormRef)" />
        <el-button type="danger" :icon="Delete" circle @click="delDept(scope.row.id)"/>
      </template>
    </el-table-column>

测试:

在测试一个错误的,然后退出,重新打开看效果。

 成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

静态代理IP该如何助力Facebook多账号注册运营?

在Facebook运营中&#xff0c;充分利用静态代理IP是多账号运营的关键一环。通过合理运用静态代理IP&#xff0c;不仅可以提高账号安全性&#xff0c;还能有效应对Facebook的算法和限制。以下是这些关键点&#xff0c;可以帮助你了解如何运用静态代理IP进行Facebook多账号运营&a…

BGP:04 fake-as

使用 fake-as 可以将本地真实的 AS 编号隐藏&#xff0c;其他 AS 内的对等体在指定本端对等体所在的AS 编号时&#xff0c;应该设置成这个伪AS 编号。 这是实验拓扑&#xff0c;IBGP EBGP 邻居都使用物理接口来建立 基本配置&#xff1a; R1: sys sysname R1 int loo0 ip add…

网络原理,网络通信以及网络协议

​​​​&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录专栏&#xff1a;网络原理,网络通信以及网络协议 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 网络原理概念网络通信局域网LAN广域网WAN 网络通信IP地址端口号…

第17节-高质量简历写作求职通关-投递反馈

&#xff08;点击即可收听&#xff09; 投递跟进和感谢信 如果对一家公司特别心仪&#xff0c;但是投递简历后一直得不到回复怎么办&#xff1f; 面试之后觉得自己没有表现好怎么办&#xff1f; 面试完几天了&#xff0c;依然没有得到回应怎么办&#xff1f; 这个时候你需要写一…

OkHttp完全解读

一&#xff0c;概述 OkHttp作为android非常流行的网络框架&#xff0c;笔者认为有必要剖析此框架实现原理&#xff0c;抽取并理解此框架优秀的设计模式。OkHttp有几个重要的作用&#xff0c;如桥接、缓存、连接复用等&#xff0c;本文笔者将从使用出发&#xff0c;解读源码&am…

sqli-labs靶场第七关

7、第七关 id1 --单引号报错,id1" --双引号不报错,可以判断是单引号闭合 id1) --也报错&#xff0c;尝试两个括号闭合&#xff0c;id1)) --不报错 接下来用脚本爆库 import stringimport requestsnumbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] letters2 list(string.ascii_…

二、Gradle 与 Idea 整合

这里写自定义目录标题 1、Groovy简介2、Groovy 安装3、创建 Groovy 项目4、Groovy 基本语法 1、Groovy简介 详细了解请参考&#xff1a;http://www.groovy-lang.org/documentation.html 2、Groovy 安装 下载后解压到本地 验证&#xff1a; groovy的安装情况 3、创建 Groo…

231. Power of Two(2 的幂)

题目描述 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2 x n 2^x n2x&#xff0c;则认为 n 是 2 的幂次方。 问题分析 题目要求的是给定一个数判断…

[ESP32 IDF] wifi 的应用

目录 背景知识 wifi的基本连接使用 WiFi篇—— WiFi两种模式文章中二、WiFi 的启动&#xff08;STA 及 AP 模式&#xff09; 输出现象 通过websocket控制LED 实践验证 实验现象 背景知识 WIFI是ESP32非常重要的一个功能&#xff0c;想要使用一下IDF的API实现将ESP32连…

Golang Playground: 轻松提升你的技能

探索、实验和学习 Go 语言 Golang Playground 是一个在线工具&#xff0c;允许用户在方便且友好的环境中实验、练习和提升他们的编码技能。无论是初学者还是开发人员&#xff0c;Golang Playground 都提供了一个无需本地安装的环境&#xff0c;可以轻松编写、编译和执行 Go 代…

第四篇:怎么写express的路由(接口+请求)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 引言&#xff1a; &#x1f4…

防御保护第六天笔记

一、防火墙的用户认证 用户、行为、流量 --- 上网行为管理三要素 防火墙管理员登录认证的作用有两点&#xff1a;检验身份的合法性&#xff0c;划分身份权限 用户认证 --- 上网行为管理的一部分 用户认证分类有以下三类&#xff1a; 1、上网用户认证 --- 三层认证 --- 所有的…

k8s 进阶实战笔记 | Scheduler 调度策略总结

文章目录 Scheduler 调度策略总结调度原理和过程调度策略nodeSelect亲和性和反亲和性NodeAffinify亲和验证PodAffinity 亲和验证PodAntiAffinity 反亲和验证污点与容忍跳过 Scheduler 调度策略 调度策略场景总结 Scheduler 调度策略总结 调度原理和过程 Scheduler 一直监听着…

拼多多砍价群2024年最新群聊分享

分享最新拼多多现金助力互助微信群138个&#xff0c;井然有序打发时间&#xff0c;拼多多互点不求人&#xff0c;#拼多多互助群#一起来相互助力&#xff01; ​拼多多互助砍价群免费助力互助群&#xff0c;拼多多助力群免费微信&#xff0c;识别下方二维码进群。拼多多助力群免…

仅需这条指令解决 sudo 报错或将用户添加到 sudoers

解决 sudo 报错或将用户添加到 sudoers 仅需这条指令 既然找到了这里&#xff0c;我只想通过查找了整整一天得到的经验和教训告诉你答案&#xff0c;不需要 nano、vim 这类的编译器&#xff0c;也不需要 chmod 更改 /etc/sudoers 文件只读权限&#xff0c;只需要控制台终端在 …

文心一言 VS ChatGPT :谁是更好的选择?

前言 目前各种大模型、人工智能相关内容覆盖了朋友圈已经各种媒体平台&#xff0c;对于Ai目前来看只能说各有千秋。GPT的算法迭代是最先进的&#xff0c;但是它毕竟属于国外产品&#xff0c;有着网络限制、注册限制、会员费高昂等弊端&#xff0c;难以让国内用户享受。文心一言…

【Redis】关于它为什么快?使用场景?以及使用方式?为何引入多线程?

目录 1.既然redis那么快&#xff0c;为什么不用它做主数据库&#xff0c;只用它做缓存&#xff1f; 2.Redis 一般在什么场合下使用&#xff1f; 3.redis为什么这么快&#xff1f; 4.Redis为什么要引入了多线程&#xff1f; 1.既然redis那么快&#xff0c;为什么不用它做主数据…

【论文解读】Object Goal Navigation usingGoal-Oriented Semantic Exploration

论文&#xff1a;https://devendrachaplot.github.io/papers/semantic-exploration.pdf 代码&#xff1a;https://github.com/devendrachaplot/Object-Goal-Navigation 项目&#xff1a; Object Goal Navigation using Goal-Oriented Semantic Exploration example&#xff1…

找不同-《企业应用架构模式》2024典藏版

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 以下是2004年《企业应用架构模式》中译本和2024年《企业应用架构模式》典藏版译本的页面。 您能从中找出至少10处不同吗&#xff1f; 如何选择UMLChina服务 UMLChina公众号精选&…

Python代码耗时统计

time模块 在代码执行前后各记录一个时间点&#xff0c;两个时间戳相减即程序运行耗时。这种方式虽然简单&#xff0c;但使用起来比较麻烦。 time.time() 函数返回的时间是相对于1970年1月1日的秒数 import timestart time.time() time.sleep(1) end time.time() print(f&…