首页 > 其他分享 >下拉框为必录字段,要求下拉框隐藏时不触发校验规则。问题:隐藏时候总是触发校验规则

下拉框为必录字段,要求下拉框隐藏时不触发校验规则。问题:隐藏时候总是触发校验规则

时间:2023-11-28 19:35:12浏览次数:24  
标签:触发 验证 rules 校验 prop 规则 下拉框

问题

下面是省份公司显示时候的页面展示:

省份公司的下拉框隐藏时候,如页面所示,点击查询,还是有提醒文字

 代码如下:

<el-form-item prop="province">
      <el-select v-if="visibility.province" v-model="searchQuery.province" placeholder="省分公司:" clearable>
            <el-option v-for="item in provinceOptions" :key="item.id" :value="item.label" :label="item.label"></el-option>
      </el-select>
</el-form-item>

通常,如果一个输入组件(例如 <el-select>)使用 v-if 来控制显示和隐藏,当 v-iffalse 时,相关的 DOM 元素会被移除,与之绑定的验证规则也不会触发。但是可能用的版本实在太老,需要再手动调整校验触发规则

解决

方案一(clearValidata失败)

在验证之前手动清除要隐藏的选择框的验证状态:

handleSearch() {
  if (!this.visibility.province) {
    this.$refs.searchQuery.clearValidate('province');
  }
  if (!this.visibility.city) {
    this.$refs.searchQuery.clearValidate('city');
  }
  if (!this.visibility.vendor) {
    this.$refs.searchQuery.clearValidate('vendor');
  }

  this.$refs.searchQuery.validate((valid) => {
    if (valid) {
      // 处理表单提交
    } else {
      // 处理验证错误
    }
  });
}

  通过 clearValidate 方法清除了不可见元素的验证状态。但是不好使

 方案二 (:prop失败)

  1. 动态设置表单项的 prop 属性,仅当元素可见时绑定,当隐藏时解绑属性:
<el-form-item :prop="visibility.province ? 'province' : null">
  <el-select v-if="visibility.province" v-model="searchQuery.province" placeholder="省分公司:" clearable>
    <!-- options -->
  </el-select>
</el-form-item>

  确保仅当 visibility.province 为真时,才会对 province 应用验证规则。

但是,用这个方法即使在省份下拉框显示的时候,校验规则依然不触发,并且当其他必录校验规则满足,直接可以提交成功,也就是说,这个字段直接失去校验了,如图:

方案三:(:rules成功)

v-if 控制了下拉框组件是否被渲染到页面上。采用 :rules 属性则是指向一个数组,用于设定下拉框的校验规则。在隐藏该下拉框时,将 rules 属性设置为一个空数组,以移除校验规则:

 <el-form-item  prop="province" :rules="visibility.province ? province : []">
    <el-select v-if="visibility.province" v-model="searchQuery.province" placeholder="省分公司:" clearable>
       <el-option v-for="item in provinceOptions" :key="item.id" :value="item.label" :label="item.label"></el-option>
    </el-select>
 </el-form-item>

思考

为什么前两种方法不行,我目前的环境是vue2+element-ui2.4.4

方案 1: 使用 clearValidate 清除验证状态

这种方法适用于动态更改表单字段可见性时,因为它可以清除之前可能已经应用到这些字段的验证结果。然而,这种方法并不会移除字段的验证规则,它只是重置验证状态。如果字段变得不可见,但由于某种原因,在验证逻辑触发时,字段依旧被 Element UI 的验证逻辑所考虑,那么仍会出现问题。

方案 2: 动态设置 prop

这种方法通过条件绑定来决定 el-form-item 是否参与验证。理论上,如果没有指定 prop,那么 Element UI 就不会去验证这个表单项。如果这个方法没有成功,可能是因为 visibility 对象状态在验证逻辑触发前没有正确更新,或者 Element UI 内部的验证器不完全依赖 prop 来判断是否应该验证该字段。

方案 3: 动态设置 rules

这是直接操纵验证规则本身。通过将 :rules 绑定为一个可以动态更新的数组,我们可以完全控制何时以及如何验证每个字段。当不想要验证时,简单地为 :rules 分配一个空数组 ([]) 即可。

为什么方案 3 成功,而前两种失败了

可能的原因包括:

  • Element UI 的验证机制:Element UI 可能在内部处理 proprules 的方式上有所不同,规则的存在可能是验证逻辑的主要触发条件。如果你没有从校验规则中移除字段,验证逻辑仍可能考虑这些字段。

  • Vue 的响应式系统细节:也可能是因为在 Vue2 中,对于对象属性的添加或删除,需要使用 $set$delete 来保证它们是响应式的,尤其是当你在组件的 data 对象以外创建对象的时候。

  • 组件状态更新的时序问题:可能存在的另一个问题是状态更新和验证逻辑的触发之间的时序问题。如果 visibility 的更新或者 prop 的更改在验证逻辑后发生,那么验证规则的应用状态可能不如预期。

方案 2 和方案 3 的区别

虽然表面上看来方案 2 和方案 3 都是动态控制验证,但实质上方案 3 提供了更细粒度的控制:

  • 方案 2 基于 prop 的存在与否来决定是否验证这个字段,没有 prop 就意味着没有验证规则。
  • 方案 3 更为直接和灵活,能够动态地给定任何规则集合,甚至可以在运行中修改具体的规则。它不仅仅是关于验证,还可以准确指定任何时点上特定字段的验证逻辑应该是什么。

综上,若方案 1 和方案 2 都未能奏效,推荐的办法是继续使用方案 3,即动态修改 rules,这是最直接、最灵活也是最可靠的方法来控制下拉框的验证行为。而 Elemental UI 可以确保只有为 :rules 提供了规则时,对应的字段才会被验证。如果组件的状态更新和清除规则发生在验证之前,这应该会确保不可见的字段不会触发任何验证。

标签:触发,验证,rules,校验,prop,规则,下拉框
From: https://www.cnblogs.com/user-yi/p/17862759.html

相关文章

  • Vue动态更新数据内容,百度下拉框提示
     <!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <metaname="viewport"content="width=device-width,initial-scale=1"> <scriptsrc="js/vue.js"></script> <......
  • Java 实现统一社会信用代码有效性校验
    一、调用工具类:importcom.yf.utils.StringUtils;importjava.util.HashMap;importjava.util.Map;/***统一社会信用代码有效性校验**@authorFengQing*@programruoyi-vue-file*@description*@date2023/09/11*/publicclassTyshxydmVerificationUtil......
  • socket.on可以直接添加自定义事件吗,理解socket的事件触发与响应
    在Web开发中,socket.on通常是用于注册处理特定事件的回调函数的方法。它主要用于处理Socket.IO库中的预定义事件,例如"connect"、"disconnect"、"message"等。然而,Socket.IO也允许你添加自定义事件,以便在客户端和服务器之间进行自定义的双向通信。要使用socket.on来处理自定义事件,......
  • 身份证校验器
    身份证号码校验规则:1、身份证号码是18位数,分别是17位数字和1位校验码。具体含义分别是:6位地址码+8位出生日期+3位顺序码+1位校验码,校验码可能为字母2、顺序码如果是奇数代表男性,偶数代表女性。3、最后1位校验码是根据前17位数字算出来的publicfinalclassIdCardUtil{......
  • Spartacus 6.0 baseSites API 的准确触发位置
    启动Spartacus后,第一个调用的API是BaseSiteAPI。BaseSiteAPI是SAPCommerceCloud中非常重要的一个API,它主要的作用包括:获取网站基本信息:BaseSiteAPI用于从SAPCommerceCloud中获取网站的基本信息,如网站的名称、ID、默认语言、默认货币、时间区等。这些信息对......
  • 零代码AppLink平台触发事件组件
    AppLink平台组件组成AppLink平台组件分成三个板块触发事件组件、基础组件和数据连接器触发组件下有三个组件,分别是Webhook、定时器、高级Webhook,那他们在AppLink平台里的原理、触发动作以及怎么使用呢?接下来为大家演示下。Webhook是什么?Webhook是AppLink的内置组件之一,其工作原......
  • Vue element 关于下拉框输入模糊查询
    最近又一个新的需求,在输入框实现输入框下拉模糊查询开始对elementui还不熟悉,不知道怎么用,不过通过网上查阅资料发现使用<el-col:span="12"><el-autocompletev-model="form.name"......
  • el-input的form表单动态输入校验
    <el-form:inline="true"class="form_inline"label-width="120px":label-position="labelPosition"><divclass="el-form-itemasterisk-left"v-for="(field,index)inperson.kpiList&qu......
  • GPT实现的企业信用代码校验函数
    functionValidateEnterpriseCode(EnterpriseCode:string):Boolean;vari,sum,code,weight:Integer;beginResult:=False;//企业信用代码长度校验ifLength(EnterpriseCode)<>18thenExit;//企业信用代码权重因子constfactor:array......
  • WPF使用多个ContextMenu菜单并绑定指定控件右键事件触发菜单,以及后台获取ContextMenu
    前端代码<Windowx:Class="EVES_ManualTest.CurveForm"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schema......