喵~

今天分享一篇在 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. ES6之常用开发知识点:字符串的扩展与正则表达式的扩展(三)

    字符串的扩展 codePointAt JavaScript 内部,字符以 UTF-16 的格式储存,每个字符固定为2个字节.对于那些需要4个字节储存的字符(Unicode 码点大于0xFFFF的字符) ...

  2. DOM & BOM – 冷知识 (新手)

    JS 无法 query select 到伪元素 参考: 使用JS控制伪元素的几种方法 JS style remove property 是 kebab-case set property 是 came ...

  3. Identity – Authorize

    前言 Authorize 授权和 Identity Framework 关系不是很大. 虽然 Framework 有帮忙处理 Role, Claims 这些, 但这些只是整个 Authorize 小部 ...

  4. SpringBoot——简介&&入门

    SpringBoot 简介 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程 起步依赖 starter:SpringBoot中常见的 ...

  5. BOOST库array使用 类似std库的vector

    BOOST库的array,  类似std库的vector. 下图所示书籍的下载地址,我的另一篇博客内有记载: https://www.cnblogs.com/happybirthdaytoyou/p/ ...

  6. Windows Terminal3.1

    其实就是为了把之前写的东西集成起来所以搞了一个终端. 下载 集成功能 Wordle ABCG RandTool cmd 便捷功能 FastFile (快速打开目标文件夹) show 文件说明 Term ...

  7. USB LPM状态

    USB的u0.u1.u2和u3代表不同的电源状态或低功耗状态,主要用于USB 3.0及其更高版本,目的是在不活动时减少功耗,同时保证设备能够迅速恢复到工作状态.这些状态的具体作用如下: U0(Acti ...

  8. Linux 提高cache命中率方法

    提高缓存命中率是优化系统性能的关键策略之一.以下是一些提高缓存命中率的有效方法: 数据局部性优化: 空间局部性:优化数据访问模式,使得数据访问在空间上连续,比如通过循环展开和数据重排. 时间局部性:确 ...

  9. Solon 3.0 新特性:SqlUtils

    Solon 3.0 引入了新的 SqlUtils 用于数据库基础操作,SqlUtils 是对 JDBC 较为原始的封装,采用了 Utils API 的风格,极为反普归真. 特性有: 支持事务管理 支持 ...

  10. 如何理解 .Net 中的 委托

    // 委托 // 一种方法的声明和定义,也就是方法的占位符 // 一般使用在 参数 和 属性中 int Add(int a,int b) { return a + b; } // 定义委托的三种方法 ...