Element UI 表单验证规则动态失效问题

2023-09-14 22:01:45

Element 版本:v2.15.3

问题背景

如下代码所示:有一个上传文件的 input 组件,在更新的时候,如果不上传文件表示不更新,如果要更新则点击 「重新上传」按钮将上传组件显示出来

<el-form ref="form" :model="form" :rules="rules" label-width="80px">
  <!-- 这个字段不是必须的没有写 prop -->
  <el-form-item v-if="!updateDocument" label="文档">
    <el-button @click="updateDocument = true">重新上传</el-button>
    <base-tips margin-left="15px">如需变更请重新上传文档</base-tips>
  </el-form-item>
  <!-- 要更新的话:这个字段要求必须,写 prop  -->
  <el-form-item v-if="updateDocument" label="文档" prop="document">
    <input
           :accept="supportFilesType"
           ref="documentFile" type="file" @change="documentFileChange"/>
  </el-form-item>
</el-form>

在这里插入图片描述
也就是如上图:不更新的话,该字段不是必须的,提交的时候就不会被校验,如果更新的话,就要让这个字段为必填项。

上述代码:从页面上看是正常的,有前面那个红色的 * 号,但是在提交的时候,并没有触发验证。

解决方案

首先:查看表单组件的信息,最终在 Field 这个属性下发现了问题

console.log(this.$refs.form)
  1. 进入页面的时候,Field 中显示的字段数量不包含 document,因为进入页面默认是不更新
  2. 切换到更新状态,Field 中的字段数量并没有变更,那么问题就出现在这里了

这种情况的最主要原因是:表单组件没有触发重新渲染,解决方案靠谱的有:

  1. 在 el-form-item 上增加 key 属性,也就是 vue 中的 key
  2. 在 el-form-item 上手动写上指定的,rules
<!-- 写上 prop,并且手动指定 rules,由于需要不校验该字段,设置一个规则 required:false  -->
<el-form-item v-if="!updateDocument" label="文档" prop="document" :rules="[{required:false}]">
  <el-button @click="updateDocument = true">重新上传</el-button>
  <base-tips margin-left="15px">如需变更合同请重新上传文档</base-tips>
</el-form-item>

<!-- 写上 prop,由于需要验证该字段,直接指向原来的 rules 中的规则-->
<el-form-item v-if="updateDocument" label="文档" prop="document" :rules="rules.document">
  <input
         :accept="supportFilesType"
         ref="documentFile" type="file" @change="documentFileChange"/>
</el-form-item>
更多推荐

企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

JVM调优笔记

双亲委派机制app---->ext----->bootstrap保证系统的核心库不被修改沙箱安全机制限制系统资源访问,将java代码限制在虚拟机特定的运行范围中基本组件字节码校验器确保java类文件遵循java规范,帮助java程序实现内存保护类加载器nativeJava的作用范围达不到了,需要调用底层栈栈内存主管程序

Java流式编程的使用

流式编程的使用步骤使用流式编程的步骤就是:设置数据源,设置数据处理的方式,设置收集结果的方式。使用filter方法实现过滤条件例子为下(查询年龄大于18的用户):@TestpublicvoidstreamTest1(){List<Student>students=Arrays.asList(newStudent("to

搜索——最短路模型,多源bfs

最短路模型,即求从起点到终点的最短路径,我们可以选择dijkstra,spfa等等,在这里我们可以利用宽搜(bfs)的特性来求,因为bfs是一层一层的向外扩展的,所以当我们第一次遍历到终点时,所在的层数即为起点到终点的最短路径。多源bfs,顾名思义,多个起点的bfs,与一般的bfs不同的地方在于根据题目要求,将多个起点

国外访问学者面签需要注意什么?

国外访问学者面签是前往国外进行学术研究或合作的关键一步,因此需要谨慎准备。以下是知识人网小编整理的一些需要注意的重要事项,以确保面签顺利进行:1.签证申请材料准备:首先,要仔细阅读所申请国家的签证要求,并准备所需的申请材料。通常,这些材料包括护照、签证申请表、邀请函、学术证明、财务证明和研究计划等。2.邀请函:如果你是

dirpro:专业的目录扫描工具教程

项目在github已开源,获取地址:https://github.com/coleak2021/dirpro1.简介dirpro是一款由python编写的目录扫描器,操作简单,功能强大,高度自动化自动根据返回状态码和返回长度,对扫描结果进行二次整理和判断,准确性非常高已实现功能可自定义扫描线程每扫描10%自动显示扫描进

位图的实现,布隆过滤器

位图:概念:由于位图是通过一个比特位来判断是不是在范围里面的,所以其对应的时间复杂度都是O(1)的。位图的实现:如上图所示:上图对应的就是3个字节,即24个比特位要想实现位图,就得知道我们要记录的这个数应该存储到哪个位置,假设这个数是x那么对应:x/32所得的值就是该数字应该存在第几个字节上x%32所得的值就是对应在此

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题Java的Interface是干什么解答上面的这个问题应该还是比较好回答的吧。只要你做过Java,通常Interface的问题多多少少会遇到,而且可能会遇到一大堆。在JAVA编程语言中是一个抽象类型(AbstractType),它被用来要求类(Class)必须实现指定的方法,使不同类的对象可以利用相同的界

Dubbo源码理解

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,

MySQL索引、事务与存储引擎

索引事务存储引擎一、索引1.1索引的概念1.2索引的实现原理1.2索引的作用1.3创建索引的依据1.4索引的分类和创建1.4.1普通索引index1.4.2唯一索引unique1.4.3主键索引primarykey1.4.4组合索引(单列索引与多列索引)1.4.5全文索引fulltext1.5查看索引1.6删除索引二、

聚类-kmeans

聚类算法是无监督学习算法,指定将数据分成k个簇。然后通过每个点到各个簇的中心的欧氏距离来分类。kmeans本身会陷入局部最小值的状况,二分kmeans可以解决这一点。二分kmeans是遍历所有的簇,将其分成2个,比较哪一个分裂结果更好,用距离和来代表误差例如现在只有一个簇A,第一轮分裂成A,A1,下一次比较A,A1两个

热文推荐