vuejs2 slots 如何与 parent 通信
vuejs2 slots how to communicate with parent
我想创建一个 formRow 组件,它有一个用于输入字段的插槽和 vee-validate 用于验证
这是我的标记
//form
<vFormRow validate="required" v-slot="{ onInput, errors }">
<vTextfield @input="onInput" :errors="errors"/>
</vFormRow>
我尝试将值发送到 parent 并使用插槽上的 @input="onInput" 获取值,但这不起作用
//formrow
<template>
<div class="mb-4">
<v-validation-provider
v-slot="{ errors }"
:rules="validate"
>
<label>{{ label }}</label>
<slot
:onInput="onInput"
:errors="errors"
/>
<vFormError
:message="errors[0]"
/>
</v-validation-provider>
</div>
</template>
<script>
import { ValidationProvider as vValidationProvider } from 'vee-validate'
import vRadioButton from '@primitives/textfield'
import vFormError from '@primitives/formError'
export default {
components: {
vTextfield,
vFormError,
vValidationProvider
},
props: {
value: {
type: String,
default: '',
},
validate: {
type: String,
required: true,
}
},
methods: {
onInput(value) {
console.log(value)
}
}
}
</script>
//textfield
<template>
<div>
<input :value="value" @input="onInput"/>
</div>
</template>
<script>
export default {
props: {
value: {
type: String,
default: '',
},
errors: {
type: Array,
default: () => {}
}
},
data: {
return {
// local_value: ''
}
}
methods: {
onInput(e) {
// this.local_value = e.target.value
this.$emit('input', e.target.value)
}
}
}
</script>
我做错了什么?
您实际上并没有将插槽道具传递给 <vTextfield>
。我认为您可能假设 <slot>
上的数据绑定和事件处理程序会自动应用于插槽的子级,但事实并非如此。
要使用 value
插槽属性,从 v-slot
解构它,并将它绑定到 <vTextfield>
子节点:
<vFormRow validate="required" v-slot="{ value }">
<vTextfield :value="value" />
</vFormRow>
您也可以将 onInput
方法作为插槽道具传递:
// vFormRow.vue
<slot :onInput="onInput" />
然后将事件处理器绑定到<vTextfield>
:
<vFormRow validate="required" v-slot="{ onInput }">
<vTextfield @input="onInput" />
</vFormRow>
我想创建一个 formRow 组件,它有一个用于输入字段的插槽和 vee-validate 用于验证
这是我的标记
//form
<vFormRow validate="required" v-slot="{ onInput, errors }">
<vTextfield @input="onInput" :errors="errors"/>
</vFormRow>
我尝试将值发送到 parent 并使用插槽上的 @input="onInput" 获取值,但这不起作用
//formrow
<template>
<div class="mb-4">
<v-validation-provider
v-slot="{ errors }"
:rules="validate"
>
<label>{{ label }}</label>
<slot
:onInput="onInput"
:errors="errors"
/>
<vFormError
:message="errors[0]"
/>
</v-validation-provider>
</div>
</template>
<script>
import { ValidationProvider as vValidationProvider } from 'vee-validate'
import vRadioButton from '@primitives/textfield'
import vFormError from '@primitives/formError'
export default {
components: {
vTextfield,
vFormError,
vValidationProvider
},
props: {
value: {
type: String,
default: '',
},
validate: {
type: String,
required: true,
}
},
methods: {
onInput(value) {
console.log(value)
}
}
}
</script>
//textfield
<template>
<div>
<input :value="value" @input="onInput"/>
</div>
</template>
<script>
export default {
props: {
value: {
type: String,
default: '',
},
errors: {
type: Array,
default: () => {}
}
},
data: {
return {
// local_value: ''
}
}
methods: {
onInput(e) {
// this.local_value = e.target.value
this.$emit('input', e.target.value)
}
}
}
</script>
我做错了什么?
您实际上并没有将插槽道具传递给 <vTextfield>
。我认为您可能假设 <slot>
上的数据绑定和事件处理程序会自动应用于插槽的子级,但事实并非如此。
要使用 value
插槽属性,从 v-slot
解构它,并将它绑定到 <vTextfield>
子节点:
<vFormRow validate="required" v-slot="{ value }">
<vTextfield :value="value" />
</vFormRow>
您也可以将 onInput
方法作为插槽道具传递:
// vFormRow.vue
<slot :onInput="onInput" />
然后将事件处理器绑定到<vTextfield>
:
<vFormRow validate="required" v-slot="{ onInput }">
<vTextfield @input="onInput" />
</vFormRow>