Прежде всего, я также новичок в Vue.js и Vee-validate, так что я исправлен.
Разница между двумя полями и полем среднего имени в том, что он является компонентом, а не собственным полем ввода.
По сути, вам нужно, чтобы компонент вел себя как вход, то есть излучал необходимые события, чтобы 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 слушает по умолчанию, но «размытие» работает для меня, а «focusout» - нет. всегда можете использовать директиву data-vv-validate-on
для особых событий, специфичных для ваших компонентов).
Вы можете обратиться к этой статье авторам библиотеки VeeValidate. Обратите внимание, как он создает компонент, который прекрасно работает с VeeValidate, заставляя компонент генерировать все нужные события.
https://medium.com/@logaretm/authoring-validatable-custom-vue-input-components-1583fcc68314