自定义组件中的 VueJS Vee-validate

Posted

技术标签:

【中文标题】自定义组件中的 VueJS Vee-validate【英文标题】:VueJS Vee-validate in Custom Components 【发布时间】:2018-06-07 13:06:30 【问题描述】:

版本 VueJs:2.3.3 Vee 验证:2.0.0-rc.25说明 我有一个自定义组件。这是一个带有字符计数器的输入,我试图将 vee-validate 放在这个输入中。我想在提交表单时显示错误。我遵循了 vee-validate 文档中的每一步,但没有成功。我的表单提交自己忽略任何输入的错误。 复制步骤: 使用 vee-validate 创建自定义组件 代码:Parent.vue

   <vue-input maxlength="20" minlength="3" placeholder="works"
    validate="required|numeric" v-model="dataItem.teste" name="teste"></vue-input>

Component.js

Vue.component('vue-input', 
    props: ['maxlength', 'minlength', 'placeholder', 'validate', 'value', 'name'],
    template: `<div>
              <div class="input-group">
                <input type="text" :name="name" :value="value" 
                @input="$emit('input', $event.target.value); 
                counter = $event.target.value.length" 
                :maxlength="maxlength" :placeholder="placeholder" 
                v-validate="validate" 
                :class="'is-danger': errors.has(name), 'form-control' : true">

                Erros: errors
                <span class="input-group-addon">
                     maxlength - counter 
                </span>

                <span v-show="errors.has(name)" class="text-danger m-t-xs">
                     errors.first(name) 
                </span>
             </div>
             </div>`,
             data: () => (
                 counter: 0
             )
);

【问题讨论】:

你的表单是什么样子的? 先这样:jqueryscript.net/images/… 我指的是表单的布局和组件。 【参考方案1】:

您可以在子组件中使用父$validator

请参阅子组件中的created() 钩子:

Children.vue

<template>
  <div>
    <div class="input-group">
      <input
          type="text"
          :name="name"
          :value="value"
          @input="handleInput"
          :maxlength="maxlength"
          :placeholder="placeholder"
          v-validate="validate"
          :class="'is-danger': $errors.has(name), 'form-control' : true"
      >

      Errors:  $errors 
      <span class="input-group-addon">
         maxlength - counter 
      </span>

      <span v-show="$errors.has(name)" class="text-danger m-t-xs">
         $errors.first(name) 
      </span>
    </div>
  </div>
</template>

<script>
  export default 
    name: 'Temp',

    props: ['maxlength', 'minlength', 'placeholder', 'validate', 'value', 'name'],

    data: () => (
      counter: 0
    ),

    methods: 
      handleInput (event) 
        this.$emit('input', event.target.value)
        this.counter = event.target.value.length
      
    ,

    created () 
      this.$validator = this.$parent.$validator
    
  
</script>

Parent.vue

<children
    maxlength="20"
    minlength="3"
    placeholder="works"
    validate="required|numeric"
    v-model="dataItem.teste"
    name="teste"
></children>

有 2 个支持更好的解决方案,但您需要在 Parent.vue 组件中移动 &lt;span&gt; 并进行验证,因为 errors/$validator在 @987654331 中可用@组件。

另外,我不能在同一个表单中拥有多个同名的输入组件,但您可以查看它们并进行测试:

解决方案 1

你可以使用Vue的provide/inject API:

Children.vue

export default 
  inject: ['$validator'],
  // ...

解决方案 2

使用 VeeValidate 的constructor options:

Children.vue

export default 
  $_veeValidate: 
    // value getter
    value () 
      return this.value
    ,
    // component name getter
    name () 
      return 'children'
    
  
  // ...

【讨论】:

以上是关于自定义组件中的 VueJS Vee-validate的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略 VueJS 中的自定义 html 标签?

自定义vue组件中的vuejs v-show调用TypeError:无法读取未定义的属性'_withTask'

vuejs的组件化开发中怎么自定义class覆盖原有样式?

vuejs的组件化开发中,要怎么自定义class,覆盖原有的css样式

VueJS 中带有函数的自定义数据对象

VueJS 自定义组件