In Vue 3, you can emit events from a parent component to a child component using the Composition API along with the provide and inject functions.
To achieve this, we do the following:
1. Parent Component (Emitter)
In the parent component, define a function to emit an event and provide it to the child component using provide.
2. Child Component (Receiver)
In the child component, use inject to access the emitted event function from the parent.
For example:
<!-- ParentComponent.vue -->
<template>
<div>
<button @click="emitToChild">Send Event to Child</button>
<ChildComponent />
</div>
</template>
<script>
import { defineComponent, provide } from 'vue';
import ChildComponent from './ChildComponent.vue';
export default defineComponent({
components: {
ChildComponent,
},
setup() {
// Define a function to emit an event
const emitToChild = () => {
// Emit the event to the child component
emitEvent('customEvent');
};
// Provide the event emitting function to child components
provide('emitEvent', emitToChild);
return {
emitToChild,
};
},
});
</script>
<!-- ChildComponent.vue -->
<template>
<div>
<p>Child Component</p>
</div>
</template>
<script>
import { defineComponent, inject } from 'vue';
export default defineComponent({
setup() {
// Inject the event emitting function from the parent
const emitEvent = inject('emitEvent');
return {
emitEvent,
};
},
});
</script>
In this example, the ParentComponent emits a custom event when the button is clicked.
The ChildComponent injects the event emitting function from the parent and can then call it when needed.
This pattern allows you to pass data or trigger actions from parent to child components in Vue 3 applications.
Adjust the event name and data payload as needed for your specific use case.