I have a base component BaseInput.vue which accepts attributes and emits events. It’s easy to bind all attributes by using v-bind="$attrs" instruction.
// BaseInput.vue
<template>
<label>
<input
v-bind="$attrs"
@focus="$emit('focus')"
@blur="$emit('blur')"
>
</label>
</template>
<script>
export default {
inheritAttrs: false,
};
</script>
Next I have a wrapper component WrapInput.vue which passes attributes to BasicInput and emits events.
// WrapInput.vue
<template>
<basic-input
v-bind="$attrs"
@focus="$emit('focus')"
@blur="$emit('blur')"
/>
</template>
<script>
import BasicInput from '@/storybook/pages/BasicInput';
export default {
components: { BasicInput },
inheritAttrs: false,
};
</script>
My question: is there a handy way in Vue to pass a bunch of events in “proxy” components without the need to list them one by one? I expect something like this:
// WrapInput.vue
<template>
<basic-input
v-bind="$attrs"
v-bind="$events" // is it possible to proxy all events in a single line?
/>
</template>
<script>
import BasicInput from '@/storybook/pages/BasicInput';
export default {
components: { BasicInput },
inheritAttrs: false,
};
</script>
P.S. I’ve heard about EventBus, but doesn’t fit nicely for my case.
Advertisement
Answer
In Vue 2, you could use v-on and $listeners to pass any event listeners to a component:
// BasicInput.vue <input v-on="$listeners">
In Vue 3, $listeners is removed, but any event listeners would be part of $attrs, so v-bind="$attrs" would suffice.