el-form/el-form-item表单验证

本文探讨了在Vue.js中遇到的一个表单验证与图片上传交互的场景。当用户上传图片后,表单的验证并未自动触发,导致验证失败。问题的原因在于el-form-item未接收到图片上传后的值变化事件。解决方案是为el-form-item绑定ref,并在图片上传成功后手动触发'el.form.blur'事件,确保与rules配置的触发事件一致。这样,图片上传成功后,表单校验能够正确进行。



一、场景

如下图所示,当触发表单验证后,输入相应的内容,表单检验通过,但是上传图片后的表单校验没有通过,需要点击表单提交触发表单提交时的校验才有效
在这里插入图片描述
在这里插入图片描述

二、原因

el-form 表单,在输入内容改变元素的值后,会触发上层 el-form-itemel.form.chang/ 'el.form.blur’事件,el-form-item 接收到此事件后,会触发表单校验

三、解决方案

1.给el-form-item 绑定 ref

代码如下(示例):

<el-form-item ref="coverImage" :label="$t('封面')" prop="coverFileCode">
   <upload-img ref="coverFileCode" biz-type="adapterRoom" biz-dtl-type="cover" @uploadSuc="successFn" @remove="removeFn" />
</el-form-item>

2. 图片上传成功后,触发校验

successFn() {
	this.formData.coverFileCode = code
    this.$refs.coverImage.$emit('el.form.blur', code)
}

注意:此处触发的事件,要与 rules 配置的一致,否则无效

rules: {
    name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
    coverFileCode: [{ required: true, message: '请上传封面', trigger: 'blur' }],
}
<think>嗯,用户想了解如何使用<el-form-item>进行表单校验。参考了几个引用内容,需要整合这些信息并提供清晰的解决方案。 引用[1]提到了动态表单校验的关键点:用v-if切换表单项时,必须同时设置prop和key属性才能正确触发校验。这里有个技术细节,key的作用是强制重新渲染组件,避免复用导致的校验状态残留。而引用[2]补充了表单基础属性,比如model和rules的绑定关系是校验的前提。 用户可能遇到的实际问题在引用[4]中体现得很典型——当表单项内部包含多个输入控件时,需要在外层包裹<el-form-item>并配置校验规则。这个案例特别有价值,因为嵌套结构容易让人忽略层级关系。引用[3]则展示了循环生成表单项时的规则配置方法,说明每个表单项需要独立绑定prop。 考虑到动态表单是高频需求,应该重点强调两种场景的处理:v-if切换时的key用法,以及嵌套表单项的prop路径写法。用户可能没意识到,rules里定义的字段名必须和model对象属性路径完全匹配,比如infoForm.specifyTime这样的点语法。 最后要提醒校验触发机制,blur和change的区别很重要。如果用户需要即时反馈,建议用change;如果是离开焦点时校验,用blur更合适。这些细节在实际开发中容易踩坑。 </think>以下是使用 `<el-form-item>` 进行表单校验的完整方法,结合引用内容的关键点整理: ### 一、基础校验配置 1. **绑定数据与规则** ```html <el-form :model="formData" :rules="formRules" ref="myForm"> <el-form-item label="用户名" prop="username"> <el-input v-model="formData.username"></el-input> </el-form-item> </el-form> ``` - `:model` 绑定表单数据对象 - `:rules` 绑定校验规则对象 - `prop` 必须与数据字段名和规则名一致 [^2][^3] 2. **规则定义示例** ```javascript formRules: { username: [ { required: true, message: '用户名不能为空', trigger: 'blur' }, { min: 3, max: 10, message: '长度3-10字符', trigger: 'change' } ] } ``` ### 二、动态表单校验 1. **v-if 切换表单项**(推荐方式) ```html <template v-if="isMember"> <el-form-item label="会员号" prop="vipCode" key="vipCode" :rules="rules.vipCode"> <el-input v-model="formData.vipCode"></el-input> </el-form-item> </template> <template v-else> <el-form-item label="手机号" prop="phone" key="phone" :rules="rules.phone"> <el-input v-model="formData.phone"></el-input> </el-form-item> </template> ``` **关键点**: - 必须同时设置 `prop` 和 `key` 保证切换时重新渲染[^1] - `key` 值需唯一(如字段名) 2. **v-show 场景的校验处理** ```javascript phone: [ { validator: (rule, value, callback) => { if (!this.isMember && !value) { // 动态判断显示状态 callback(new Error('手机号不能为空')); } else { callback(); } }, trigger: 'blur' } ] ``` 需通过自定义校验函数动态判断显示状态[^1] ### 三、特殊场景处理 1. **单个表单项内多个控件** ```html <el-form-item label="发布时间" prop="specifyTime" :rules="infoForm.publishNow ? [] : rules.time"> <el-switch v-model="infoForm.publishNow" @change="handleChange"/> <div v-if="!infoForm.publishNow"> <el-date-picker v-model="infoForm.specifyTime" ... /> </div> </el-form-item> ``` 外层 `el-form-item` 统一管理校验[^4] 2. **循环生成的表单项** ```html <div v-for="(item, index) in items" :key="index"> <el-form-item :label="`类别${index+1}`" :prop="'items.' + index + '.type'" :rules="typeRules"> <el-input v-model="item.type"/> </el-form-item> </div> ``` **关键点**: - `prop` 使用点语法路径:`'items.0.type'`[^3] - 每个表单项需独立绑定规则 ### 四、校验触发方式 | 属性 | 作用 | 适用场景 | |------------|-------------------------------|-----------------------| | `trigger` | 触发时机(blur/change) | 输入框建议用 `blur` | | `required` | 必填校验 | 需配合 `message` 使用 | | `validator`| 自定义校验函数 | 复杂逻辑校验 | ### 五、手动触发校验 ```javascript // 提交时整体校验 this.$refs.myForm.validate(valid => { if (valid) { /* 提交操作 */ } }); // 动态清除校验 this.$refs.myForm.clearValidate(['phone', 'vipCode']); ``` > **重要原则**: > 1. `prop` 路径必须与 `model` 字段完全匹配 > 2. 动态表单必须用 `key` 避免复用问题[^1] > 3. 嵌套表单项需确保层级关系正确[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值