喵~

今天分享一篇在 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使用技巧:动态切换校验规则的最佳实践的更多相关文章

  1. jquery.validate动态更改校验规则

    有时候表单中有多个字段是相互关联的,以下遇到的就是证件类型和证件号码的关联,在下拉框中选择不同的证件类型,证件号码的值的格式都是不同的,这就需要动态的改变校验规则. 点击(此处)折叠或打开 <! ...

  2. jquery.validate动态更改校验规则 【转】

    有时候表单中有多个字段是相互关联的,以下遇到的就是证件类型和证件号码的关联,在下拉框中选择不同的证件类型,证件号码的值的格式都是不同的,这就需要动态的改变校验规则. <!DOCTYPE html ...

  3. Oracle 社区动态、中文讲座,最佳实践

    https://community.oracle.com/thread/3789691https://community.oracle.com/community/support/%E4%B8%AD% ...

  4. Vue Element-ui表单校验规则,你掌握了哪些?

    1.前言   Element-ui表单校验规则,使得错误提示可以直接在form-item下面显示,无需弹出框,因此还是很好用的.   我在做了登录页面的表单校验后,一度以为我已经很了解表单的校验规则. ...

  5. Element Ui使用技巧——Form表单的校验规则rules详细说明

    Element UI中对Form表单验证的使用介绍: Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item的 prop 属性设置为需校验的字段名 ...

  6. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  7. 深入了解Element Form表单动态验证问题 转载

    随风丶逆风 2020-04-03 15:36:41  2208  收藏 3 分类专栏: Vue 随笔 文章标签: 动态验证 el-form elementUI 表单验证 版权 在上一篇<vue ...

  8. Pytest测试框架一键动态切换环境思路及方案

    前言 在上一篇文章<Pytest fixture及conftest详解>中,我们介绍了fixture的一些关键特性.用法.作用域.参数等,本篇文章将结合fixture及conftest实现 ...

  9. 在使用 Spring Boot 和 MyBatis 动态切换数据源时遇到的问题以及解决方法

    相关项目地址:https://github.com/helloworlde/SpringBoot-DynamicDataSource 1. org.apache.ibatis.binding.Bind ...

  10. Vue.js-----轻量高效的MVVM框架(十二、组件动态切换)

    在写html的过程中,我们经常会遇到要写tabs的切换,类似于这样: 在vue中,我们也有自己的组件和属性来实现这样的效果,这个东西我们叫做动态组件. html: <h3>动态组件< ...

随机推荐

  1. 【解题报告】P8478 「GLR-R3」清明

    P8478 「GLR-R3」清明 参考了出题人题解和 xcyyyyyy 大神的题解,强推前两篇. 拿到题完全没思路怎么办??? 人类智慧的巅峰,思维量的登峰造极. 换句话说就是非人题目,不过不得不说 ...

  2. JavaScript – ECMAScript 版本

    参考 TC39.ECMA-262.ECMAScript 的一些事儿 简史 es3 千禧年后稳定版 es4 革命版本, 最后在 2008 年难产了 es5 2009 年推出, 拿了 es4 一些比较简单 ...

  3. OData – 权限管理

    前言 OData 其实没有权限的机制, Client 可以任意的 $select, $expand. 即便它可以做简单防御设置, 但是离平常的业务需求还是很远. 一般上 query entity 常见 ...

  4. 痞子衡嵌入式:MCUBootUtility v6.3发布,支持获取与解析启动日志

    -- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v5.3.0)发布过去一年了,期间痞子衡也做过三个版本更新,但不足以单独介绍.这一次痞子衡为大家带来了全新重要版本v6. ...

  5. Redis 内存突增时,如何定量分析其内存使用情况

    背景 最近碰到一个 case,一个 Redis 实例的内存突增,used_memory最大时达到了 78.9G,而该实例的maxmemory配置却只有 16G,最终导致实例中的数据被大量驱逐. 以下是 ...

  6. .net 到底行不行!2000 人在线的客服系统真实屏录演示(附技术详解) 📹

    业余时间用 .net 写了一个免费的在线客服系统:升讯威在线客服与营销系统. 时常有朋友问我性能方面的问题,正好有一个真实客户,在线的访客数量达到了 2000 人.在争得客户同意后,我录了一个视频. ...

  7. [R18][中国語翻訳]HDKのABC370赛試(ABC370)

    A.Raise Both Hands \(\texttt{Diff }11\) #include<bits/stdc++.h> using namespace std; #define e ...

  8. 深入理解 Nuxt.js 中的 app:created 钩子

    title: 深入理解 Nuxt 中的 app created 钩子 date: 2024/9/26 updated: 2024/9/26 author: cmdragon excerpt: 摘要:本 ...

  9. 完美转发(模板)--T&&

    在C++模板编程中,完美转发(Perfect Forwarding)是一种技术,旨在保留函数参数的值类别,即在将参数传递到另一个函数时,无论参数是左值还是右值,都能够保持它的原始性质,而不会因为转发丢 ...

  10. 2. 王道OS-操作系统的特征,发展和分类

    1. 并发:宏观上是同时发生的,微观是交替发生的 :ps:并行:宏观和微观都是同时发生的 : ps:单核CPU同一时刻只能执行一个程序,各个程序只能并发的执行 : 多核CPU同一时刻可以同时执行多个程 ...