【ElementPlus】el-form使用技巧:动态切换校验规则的最佳实践
喵~
今天分享一篇在 ElementPlus 中使用 el-form 动态切换校验规则 的实用方法。
一、问题概述
作为前端开发人员,在开发项目中,特别是后台管理系统,表单的使用是必不可少的。当业务需求复杂时,常常需要根据不同的参数动态切换校验规则。
当动态切换校验规则时,可能会出现一些意想不到的状况,
比如:
问题 1
- 如果触发了一个规则,表单报红后没有reset,再切换新规则,则原有规则的报红依旧显示的问题;
问题 2
- 表单会主动触发新规则的校验,导致表单直接报红;
根据上述2个问题,解决方案如下:
二、项目配置
| 名称 | 版本 |
|---|---|
| element-plus | ^2.8.8 |
| vue | ^3.5.12 |
| typescript | ~5.6.3 |
这里采用了 vue + ts 的开发方式,不喜欢 ts 的小伙伴可以根据项目自行删除不需要的代码~
三、解决方案
整体代码是在 ElementPlus form 校验功能模块的基础上进行优化升级的~
代码做了精简,重点突出解决方案的代码~
源码在此处:https://element-plus.org/zh-CN/component/form.html

项目引入必要代码
import { reactive, ref } from 'vue'
import type { ComponentSize, FormInstance, FormRules } from 'element-plus'
接下来进行优化升级:
1. 定义规则
(1)TS接口
interface IRuleFormOne {
name: string
region: string
count: string
}
interface IRuleFormTwo {
delivery: boolean
location: string
type: string[]
resource: string
desc: string
}
/**
* 此处需要汇总一个完整规则,用于整体表单
*/
interface RuleForm extends IRuleFormOne, IRuleFormTwo{}
(2)规则
const rulesOne = reactive<FormRules<IRuleFormOne>>({
name: [
{ required: true, message: 'Please input Activity name', trigger: 'blur' },
{ min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' },
],
region: [
{
required: true,
message: 'Please select Activity zone',
trigger: 'change',
},
],
count: [
{
required: true,
message: 'Please select Activity count',
trigger: 'change',
},
],
})
const rulesTwo = reactive<FormRules<IRuleFormTwo>>({
location: [
{
required: true,
message: 'Please select a location',
trigger: 'change',
},
],
type: [
{
type: 'array',
required: true,
message: 'Please select at least one activity type',
trigger: 'change',
},
],
resource: [
{
required: true,
message: 'Please select activity resource',
trigger: 'change',
},
],
desc: [{ required: true, message: 'Please input activity form', trigger: 'blur' }],
})
/**
* 可以先给表单赋一个初始规则
*/
const rules = ref<FormRules>(rulesOne)
2. 表单值
const ruleForm = reactive<RuleForm>({
name: 'Hello',
region: '',
count: '',
delivery: false,
location: '',
type: [],
resource: '',
desc: '',
})
3. 功能按钮
这里不是重点,用什么切换都可以,此处我用了两个普通按钮,并定义了 handleClickRule 方法来切换规则
/**
* Template部分
*/
<el-button-group class="rule-btn-group">
<el-button :type="actBtn === 1 ? 'primary' : ''" @click="handleClickRule(1)">规则一</el-button>
<el-button :type="actBtn === 2 ? 'primary' : ''" @click="handleClickRule(2)">规则二</el-button>
</el-button-group>
/**
* TS部分
*/
const actBtn = ref(1)
4. 实现切换规则
解决问题1
/**
* 这里是 Element Plus 原有代码,不需要优化,只是后面会用到,所以直接展示在这里
*/
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
/**
* 重点在这里!
*/
function handleClickRule(idx: number) {
actBtn.value = idx
switch (idx) {
case 1:
/**
* 这一行很关键,解决问题1,切换前,先清除已有的报红
*/
resetForm(ruleFormRef.value)
rules.value = rulesOne
break
case 2:
resetForm(ruleFormRef.value)
rules.value = rulesTwo
break
default:
break
}
}
解决问题2
el-form 添加一条属性配置即可解决:
<el-form
ref="ruleFormRef"
style="max-width: 600px"
:model="ruleForm"
:rules="rules"
label-width="auto"
:size="formSize"
status-icon
:validate-on-rule-change="false"
>
官方提供了现成的解决方案,原出处说的很清楚:

完整操作效果展示:

四、结语
至此,问题1、2都完美解决,其实很多功能看文档就能够解决大部分问题了。
有任何问题的小伙伴可以留言交流~
【ElementPlus】el-form使用技巧:动态切换校验规则的最佳实践的更多相关文章
- jquery.validate动态更改校验规则
有时候表单中有多个字段是相互关联的,以下遇到的就是证件类型和证件号码的关联,在下拉框中选择不同的证件类型,证件号码的值的格式都是不同的,这就需要动态的改变校验规则. 点击(此处)折叠或打开 <! ...
- jquery.validate动态更改校验规则 【转】
有时候表单中有多个字段是相互关联的,以下遇到的就是证件类型和证件号码的关联,在下拉框中选择不同的证件类型,证件号码的值的格式都是不同的,这就需要动态的改变校验规则. <!DOCTYPE html ...
- Oracle 社区动态、中文讲座,最佳实践
https://community.oracle.com/thread/3789691https://community.oracle.com/community/support/%E4%B8%AD% ...
- Vue Element-ui表单校验规则,你掌握了哪些?
1.前言 Element-ui表单校验规则,使得错误提示可以直接在form-item下面显示,无需弹出框,因此还是很好用的. 我在做了登录页面的表单校验后,一度以为我已经很了解表单的校验规则. ...
- Element Ui使用技巧——Form表单的校验规则rules详细说明
Element UI中对Form表单验证的使用介绍: Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item的 prop 属性设置为需校验的字段名 ...
- SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...
- 深入了解Element Form表单动态验证问题 转载
随风丶逆风 2020-04-03 15:36:41 2208 收藏 3 分类专栏: Vue 随笔 文章标签: 动态验证 el-form elementUI 表单验证 版权 在上一篇<vue ...
- Pytest测试框架一键动态切换环境思路及方案
前言 在上一篇文章<Pytest fixture及conftest详解>中,我们介绍了fixture的一些关键特性.用法.作用域.参数等,本篇文章将结合fixture及conftest实现 ...
- 在使用 Spring Boot 和 MyBatis 动态切换数据源时遇到的问题以及解决方法
相关项目地址:https://github.com/helloworlde/SpringBoot-DynamicDataSource 1. org.apache.ibatis.binding.Bind ...
- Vue.js-----轻量高效的MVVM框架(十二、组件动态切换)
在写html的过程中,我们经常会遇到要写tabs的切换,类似于这样: 在vue中,我们也有自己的组件和属性来实现这样的效果,这个东西我们叫做动态组件. html: <h3>动态组件< ...
随机推荐
- 通过MobaXterm操作远程服务器电脑的方法
本文介绍在Windows电脑中,下载.配置MobaXterm软件,从而连接.操作远程服务器的方法. 因为是在Windows操作系统的电脑中连接服务器,所以建议使用MobaXterm.PuTTY ...
- ptmalloc、tcmalloc与jemalloc对比分析
背景介绍 在开发微信看一看期间,为了进行耗时优化,基础库这层按照惯例使用tcmalloc替代glibc标配的ptmalloc做优化,CPU消耗和耗时确实有所降低.但在晚上高峰时期,在CPU刚刚超过50 ...
- kmemleak 和kasan 的区别
kmemleak 和kasan 都是 Linux 内核中的一些工具和特性,用于帮助进行内存错误检测和修复.然而,它们之间有一些区别: 功能:kmemleak 用于检测内核中未释放的内存泄漏,它可以跟踪 ...
- Java日期时间API系列16-----Jdk8中java.time包中的新的日期时间API类,java日期计算3,日期中年月日时分秒的属性值修改等
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- 数据库周刊60丨3月国产数据库排行榜出炉;日本银行数据迁移失败致使业务宕机;阿里云RDS PG13发布;亚健康Oracle数据库故障定位;Redis最佳实践;MySQL查询优化……
热门资讯 1.2021年3月国产数据库排行榜:雏凤声清阿里三连 绝代双骄华为合璧 [摘要]2021年3月国产数据库流行度排行榜已出炉,在本月排行的前十名中,TiDB 仍然以领先第二名135分 的优势稳 ...
- 11-react使用props.children 处理父子组件之间的传值
// props.children 组件传值 import { Component } from "react" import reactDom from "react- ...
- Android复习(二)应用资源——>字体
字体资源定义了可在应用中使用的自定义字体.字体可以是单独的字体文件或字体文件的集合,称为字体系列,并在 XML 中定义. 另请参阅如何定义 XML 中的字体,或改用可下载字体. 捆绑式字体 您可以将字 ...
- go frame资源管理打包失败
最近有个需求,需要使用golang做一个小工具,然后我就想既然是小工具,那就把前后端放在一个二进制文件中.恰好使用的项目架构是go frame,它已经提供了这样的能力,但是没想到碰到了一鼻子灰... ...
- 关于git的安装
window平台下面: 步骤一: 首先去官网下载安装包: 官方链接:https://git-scm.com/download/win 至于选择32位还是64为的,各位就见仁见智了(根据自己的系统). ...
- 学习JavaScript第二天
文章目录 1.运算符(操作符) 1.1运算符的分类 1.2算数运算符 1.3递增和递减运算符 1.4比较运算符 1.5逻辑运算符 2.选择结构 2.1if语句 2.1.1语法 2.1.2案例1:判断闰 ...