问题
在使用 elementui 表单的过程中,某些表单项需要通过 v-if 来判断是否展示,但是这些表单项出现了检验失效的问题。
解决方法
1、给需要 v-if 判断的表单项添加 key 值
html
<el-form ref="form" :model="form">
<el-form-item
:key="0"
v-if="hasItem"
label="名称"
prop="type">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item
:key="1"
v-if="hasItem"
label="类型"
prop="type">
<el-input v-model="form.type"></el-input>
</el-form-item>
</el-form>
2、将校验规则直接绑定在 el-form-item 上
html
<el-form ref="form" :model="form">
<el-form-item
:rules="{required: true, message:'请输入名称', trigger: 'change'}"
v-if="hasItem"
label="名称"
prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item
:rules="{required: true, message:'请输入类型', trigger: 'change'}"
v-if="hasItem"
label="类型"
prop="type">
<el-input v-model="form.type"></el-input>
</el-form-item>
</el-form>
3、v-show 代替 v-if
这种方法存在一个问题,就是如果 v-if 判断的表单项中如果存在相同字段的项就会导致重复校验的问题,所以这种方法需要在判断的表单项字段都不相同的情况下使用。
html
<el-form ref="form" :model="form">
<el-form-item
v-show="hasItem"
label="名称"
prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item
v-show="hasItem"
label="类型"
prop="type">
<el-input v-model="form.type"></el-input>
</el-form-item>
</el-form>
4、使用自定义校验规则
html
<el-form ref="form" :model="form">
<el-form-item
:key="0"
v-if="hasItem"
label="名称"
prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item
:key="1"
v-if="hasItem"
label="类型"
prop="type">
<el-input v-model="form.type"></el-input>
</el-form-item>
</el-form>
javascript
const checkName = (rule, value, callback) => {
if (!value) {
return callback(new Error('名称不能为空'));
}
}
data(){
return{
rules: {
name: [
{ validator: checkName , trigger: 'change' }
],
}
}
}