自定义组件中的 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
组件中移动 <span>
并进行验证,因为 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的主要内容,如果未能解决你的问题,请参考以下文章
自定义vue组件中的vuejs v-show调用TypeError:无法读取未定义的属性'_withTask'