以下是我的代码。我的表格中有三个字段。名字,中间名,姓氏。所有这些字段都按要求设置。唯一的区别是“Firstname& Lastname”包含输入标记,但“Middlename”包含b-form-input标记。实际上我的问题是,当我关注(模糊)这些(“名字和姓氏”)字段时,它会抛出一个必需的错误但是当我为(“Middlename”)字段执行相同操作时它不会Image1。我必须在那个(“Middlename”)字段Image2中输入值,然后我删除它抛出错误的值 Image3,即必需的验证仅在“(”中间名“)字段的”更改“上工作。这是什么原因?
<template>
<b-card>
<h4 slot="header" class="card-title">Employee</h4>
<b-row>
<b-col sm="3">
<b-form-group>
<label for="name">First Name </label>
<input type="text" id="" class="form-control" placeholder="Enter your name" v-validate="'required'" name="Firstname">
<span v-show="errors.has('Firstname')" class="is-danger">{{ errors.first('Firstname') }}</span>
</b-form-group>
</b-col>
<b-col sm="3">
<b-form-group>
<label for="name">Middle Name </label>
<b-form-input type="text" id="" class="form-control" placeholder="Enter your name" v-validate="'required'" name="Middlename"> </b-form-input>
<span v-show="errors.has('Middlename')" class="help is-danger">{{ errors.first('Middlename') }}</span>
</b-form-group>
</b-col>
<b-col sm="3">
<b-form-group>
<label for="name">Last Name </label>
<input type="text" id="" class="form-control" placeholder="Enter your middle name" v-validate="'required|Name'" name="Lastname">
<span v-show="errors.has('Lastname')" class="help is-danger">{{ errors.first('Lastname') }}</span>
</b-form-group>
</b-col>
</b-row>
<input type="submit" value="Submit" @click="validateForm">
</b-card>
</template>
<script>
import Vue from 'vue'
import VeeValidate from 'vee-validate';
Vue.use(VeeValidate);
export default {
name: 'addEmpl',
created: function() {
this.$validator.extend('Name', {
getMessage: field => '* Enter valid ' + field + '',
validate: value => /^[a-zA-Z]*$/.test(value)
});
}
}
</script>
<style lang="scss" scoped>
.is-danger{
color: RED;
}
</style>
答案 0 :(得分:1)
首先,我也是Vue.js和Vee-validate的新手,所以我可以纠正。
2个字段和Middlename字段之间的区别在于,它是组件而不是本机输入字段。
从本质上讲,您需要使组件的行为像输入一样,即发出必要的事件,以便Vee-validate可以对它们进行选择(“ input”,“ change”,“ blur” 等)。
例如,如果您的组件是一个在输入上换行的div,它将是这样的:
<template>
<div class="myClassForDiv">
<input
type="text"
class="myClass"
@blur="$emit('blur')"
@input="$emit('input', $event.target.value)"
>
</div>
</template>
<script>
export default {
name: "b-form-input"
}
</script>
与该问题有关的部分是@blur="$emit('blur')"
。没有此行,VeeValidate无法通知发生的模糊事件,因此无法验证(我不知道VeeValidate默认会听其他哪些事件,但是'blur'对我有用,而'focusout'对我不起作用。始终可以将data-vv-validate-on
指令用于特定于您组件的特殊事件。
您可以通过VeeValidate库的维护者来参考本文。注意他如何通过使组件发出所有正确的事件来创建与VeeValidate完美配合的组件。
https://medium.com/@logaretm/authoring-validatable-custom-vue-input-components-1583fcc68314