解决 el-form 异步校验导致重复校验的问题

本文介绍了在Vue项目中遇到的el-form异步校验导致的重复校验问题。当用户在输入验证码后未移出焦点直接点击确认时,由于异步校验,会触发两次校验,影响用户体验。解决方案是通过watch监听表单验证码输入框的值,当输入长度达到6时自动触发验证,避免了重复校验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决 el-form 异步校验导致重复校验的问题

业务逻辑

最近项目上有个业务,确认表单,需要用到手机验证码,验证是否为本人操作。这挺常见的,但是需要用户填写完,输入框失去焦点时就将验证码发送后台进行验证,而且验证码只能输一次。

触发场景

若用户输入完验证码后,鼠标焦点并未离开,直接点击确认的话,因为 validator 异步的关系,鼠标离开焦点触发一次校验,确认也触发一次校验,导致 重复校验,用户体验极差

解决办法

用watch 动态监听 form 表单里验证码输入框的值,并进行相应判断,输入长度为6时自动触发验证

<template>
	<el-form ref="form" :model="form" :rules="rules" label-width="160px" label-suffix=" :">
		<el-form-item label="手机验证码" prop="sms" :rules="{ validator : sms , required : true , trigger : 'blur'}" key="sms">
            	<!-- 验证码输入框 -->
                <el-input v-model="form.sms"  maxlength="6" show-word-limit/>
            	<!-- 发送验证码组件 -->
                <simple-sms  :api="POST_DSP_SEND" />
            </el-form-item>
	</el-form>
</template>
<script>
watch : {
	'form.sms': function (val) { //单个数据验证
  		if(val!= undefined && val.length == 6){
    		this.validateField('sms')
  		}
	}
} ,
methods : {
	//表单单项验证
    validateField(fieldName) {
      this.$refs.form.validateField(fieldName)
    } ,
    // 验证码验证
    sms(r , v , c) {
      if (!v) {
        return c(new Error('请输入验证码'))
      } else if (this.validPass){  // validPass 字段代表验证成功
        c()
      }
      if(!this.loading){
        this.loading = true
        http.post(this.POST_DSP_VERIFY, {code: v}).then(() => {
          // 验证成功
          this.validPass = true
          return c()
        }).catch(() => {
          return c(new Error('请输入正确验证码'))
        }).finally(()=>{
          // 按钮启用
          this.loading = false
        })
      }
    },
}
</script>

这里主要是提供一个思路,利用watch去监听form的数据来触发验证;也能通过禁用确认按钮先进行验证来完成,如果你有更好的办法,非常欢迎你在评论教教我

### Vue 3 中 el-form 的表单校验方法及规则配置 在 Vue 3 中,`<el-form>` 是 Element Plus 提供的一个组件,用于创建复杂的表单并实现数据验证功能。以下是关于如何设置 `<el-form>` 表单校验的方法以及规则配置的详细介绍。 #### 1. 基本结构与属性绑定 为了启用表单校验功能,需要将 `model` 和 `rules` 属性绑定到 `<el-form>` 上。其中: - **`:model`** 定义了表单的数据模型。 - **`:rules`** 则定义了各个字段的具体校验规则。 ```html <el-form :model="form" :rules="rules" ref="ruleForm"> </el-form> ``` 上述代码片段展示了基本的 `<el-form>` 配置方式[^1]。 #### 2. 设置校验规则 校验规则可以通过对象的形式定义,并将其赋值给 `:rules` 属性。每条规则可以指定多个条件,例如必填项、长度限制等。 ```javascript const rules = { username: [ { required: true, message: '请输入用户名', trigger: 'blur' }, { min: 3, max: 10, message: '长度应在 3 到 10 个字符之间', trigger: 'blur' } ], password: [ { required: true, message: '请输入密码', trigger: 'change' }, { pattern: /^[A-Za-z0-9]{6,18}$/, message: '密码应为6至18位字母或数字组合', trigger: 'change' } ] }; ``` 以上代码展示了一个简单的校验规则集合,其中包括用户名和密码两个字段的校验逻辑。 #### 3. 手动触发校验 当用户点击提交按钮,通常希望先执行一次完整的表单校验操作。这可以通过调用 `<el-form>` 实例上的 `validate()` 方法完成: ```javascript const handleSubmit = () => { ruleForm.value.validate((valid) => { if (valid) { console.log('表单校验成功'); // 提交表单逻辑... } else { console.error('表单校验失败'); } }); }; ``` 此函数会在用户点击提交按钮被调用,从而判断当前表单是否满足所有的校验规则。 #### 4. 单独字段校验 如果仅需针对某个特定字段进行即校验,则可使用 `validateField()` 方法。该方法接受字段名称作为参数,并返回 Promise 对象以便于异步处理。 ```javascript const validateSingleField = async () => { await unref(ruleForm).validateField('username'); // 只校验用户名字段 }; ``` 这段代码演示了单独对某一字段(此处为 `username`)实施校验的过程[^2]。 #### 5. 自定义校验器 对于一些复杂场景下的特殊需求,还可以自定义校验器来增强灵活性。下面是一个例子,它实现了基于其他字段动态调整校验逻辑的功能: ```javascript { validator: (rule, value, callback) => { if (!value || value.length < 5) { callback(new Error('输入的内容太短')); } else { callback(); } }, trigger: ['blur'] } ``` 通过这种方式能够更加灵活地控制不同业务场景中的具体行为。 --- ### 总结 综上所述,在 Vue 3 中利用 Element Plus 的 `<el-form>` 组件不仅可以轻松构建交互性强的表单界面,还能借助其内置机制高效管理各种类型的前端校验任务。无论是整体还是局部层面的操作都提供了丰富的 API 支持,极大地简化开发流程的同也提升了用户体验质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白菜new

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值