问题
在使用 elementui 表单的过程中,某些表单项需要通过 v-if 来判断是否展示,但是这些表单项出现了检验失效的问题。
解决方法
1、给需要 v-if 判断的表单项添加 key 值
<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 上
<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 判断的表单项中如果存在相同字段的项就会导致重复校验的问题,所以这种方法需要在判断的表单项字段都不相同的情况下使用。
<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、使用自定义校验规则
<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>
const checkName = (rule, value, callback) => {if (!value) {return callback(new Error('名称不能为空'));}
}data(){return{rules: {name: [{ validator: checkName , trigger: 'change' }],}}
}