2

下面是我的代码。我的表单中有三个字段。名中间名姓。所有这些字段都设置为必填项。唯一的区别是“Firstname & Lastname”包含输入标签,但“Middlename”包含 b-form-input 标签。实际上我的问题是,当我关注(模糊)这些(“Firstname & Lastname”)字段时,它会引发一个必需的错误,但是当我对 ("Middlename") 字段执行相同操作时,它不会Image1。我必须在该(“中间名”)字段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>
4

1 回答 1

3

首先,我也是 Vue.js 和 Vee-validate 的新手,所以我是正确的。

2个字段和中间名字段的区别在于它是一个组件而不是原生输入字段。

本质上,您需要使组件的行为类似于输入,即发出必要的事件,以便 Vee-validate 可以接收它们(“输入”、“更改”、“模糊”等)。

例如,如果您的组件是一个包装在输入上的 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 默认会监听哪些其他事件,但“模糊”对我有效,而“焦点输出”则无效。你始终可以将该data-vv-validate-on指令用于特定于您的组件的特殊事件)。

你可以参考 VeeValidate 库的维护者的这篇文章。请注意他是如何通过使组件发出所有正确的事件来创建一个与 VeeValidate 完美配合的组件。

https://medium.com/@logaretm/authoring-validatable-custom-vue-input-components-1583fcc68314

于 2018-08-09T19:07:37.193 回答