I have setup mitt and trying to dispatch event to another component but I am having hard time because in the setup()
method it doesn’t have this
for accessing app instance.
Here is what I tried:
import App from './App.vue' const el = document.getElementById('app') import mitt from 'mitt'; const emitter = mitt(); const app = createApp(App) app.config.globalProperties.emitter = emitter; app.mount(el);
And in the component, I want to dispatch an event
export default { setup() { function toggleSidebar() { this.emitter.emit('toggle-sidebar'); console.log(this); // binds to setup(), not the vue instance. } } }
As this
doesn’t exist, I can’t access the .emitter
. What am I missing? How to use officially suggested mitt in Vue 3 composition api?
By the way if I use the v2 syntax, I can access this.emitter
. But I am curious about Composition API way
export default { mounted() { console.log(this.emitter); // works } }
Answer
You may be able to use getCurrentInstance
to get the global property
component:
import { getCurrentInstance } from 'vue'; export default { setup() { // get current instance const internalInstance = getCurrentInstance(); // get the emitter from the instance const emitter = internalInstance.appContext.config.globalProperties.emitter; } }