【问题标题】:How can i access the errors computed property on custom input component validated using vee-validate?如何访问使用 vee-validate 验证的自定义输入组件上的错误计算属性?
【发布时间】:2018-06-15 12:18:01
【问题描述】:

我正在尝试在自定义输入组件中使用 VeeValidate。

我尝试在 @input@blur 上使用 $emit,但验证发生在下一个刻度上,我最终未能捕获事件验证。

  onEvent (event) {
    console.log('error length', this.errors.items.length)
    if (this.errors.items.length) {
      this.hasError = true
      this.$emit('has-error',this.errors.items)
    } else {
      this.hasError = false
      this.$emit('on-input', event)

    }
  }

我还尝试从父级注入验证器,以便能够直接访问错误计算属性,但父页面和自定义输入组件本身之间可能存在 1-2-3 级嵌套。我必须通过所有这些注入验证器,并且这些组件是可重用的。

 export default {
   //in custom input component
   inject: ['$validator'],
 }

我得到的最好的想法是观察 errors 计算属性,并在该组件实例中的错误发生更改时发出一个事件。

watch: {
  errors: function (errorsNew) {
    console.log('errors watch',errorsNew)
  }
},

问题是我似乎看不到 vee-validate 引入的错误计算属性。

一些简化版本的代码:

父母

<template>
  <div id="app">

    <CustomInput
      :label="'Lable1'"
      :value="'value from store'"
      :validations="'required|max:10|min:5'"
      :name="'lable1'"
    />
    <button>Save</button>
  </div>
</template>

<script>
import CustomInput from "./components/CustomInput";

export default {
  name: "App",
  components: {
    CustomInput
  }
};
</script>

自定义输入

<template>
   <div>
     <label >{{ label }}</label>
     <input :value="value" :name="name" v-validate="validations">
     <span v-if="this.errors.items.length">{{this.errors.items[0].msg}}</span>
  </div>

</template>

<script>
export default {
  name: "HelloWorld",

  props: {
    label: {
      type: String,
      required: true
    },
    value: {
      type: String,
      default: ""
    },
    validations: {
      type: String,
      default: ""
    },
    name: {
      type: String,
      required: true
    }
  },

  watch: {
    errors: function(errorsNew) {
      console.log("errors watch", errorsNew);
      this.$emit('has-error')
    }
  }
};
</script>

有人可以帮我访问自定义输入中的验证错误吗?

更新

如果有人觉得更容易测试它,我创建了一个简单的小提琴https://codesandbox.io/s/mqj9y72xx

【问题讨论】:

    标签: javascript validation vue.js vuejs2 vee-validate


    【解决方案1】:

    我认为处理这个问题的最好方法是将$validator 注入到子组件中。这似乎是插件建议的方式:https://baianat.github.io/vee-validate/advanced/#injecting-parent-validator

    因此,在您的 CustomInput 中,您将添加 inject: ['$validator'],

    然后,在 App.vue 中,你可以在模板中拥有这个:

    <div>
      These are the errors for "lable1" in App.vue:
         <span v-if="errors.has('lable1')">{{errors.first('lable1')}}</span>
    </div>
    

    我认为确实如此。

    基于您的示例的工作示例:https://codesandbox.io/s/pw2334xl17

    我意识到您已经考虑过这一点,但是 inject 方法会向上搜索组件树,直到找到 $validator 实例,所以也许您应该在应用程序的根级别禁用自动注入,因此每个组件搜索要注入的验证器都会得到那个。你可以这样做:

    Vue.use(VeeValidate, { inject: false });

    【讨论】:

    • 仅适用于一个文本字段,如果您复制组件(也使用新名称)并在一个组件中出错,则该错误会显示在所有组件上。
    • v3的解决方案是什么?v3不再注入
    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 2018-11-25
    • 2020-01-15
    • 2017-04-22
    • 2018-03-01
    相关资源
    最近更新 更多