vue-parent-emit

Emit events from a parent Vue component to children
9,528 1
Install
npm install vue-parent-emit
Latest Version:3.1.2
Vue:3
Older releases:2
License:MIT
Last Updated:Nov 26, 2025
Links: GitHub  ·  npm
Maintainer: kkuegler

vue-parent-emit

Trigger events from a parent Vue 3 component to one or more child components.

There is also a Vue 2 version of this library.

Description

This small library provides an intentionally limited event bus. It allows parents to emit events and children to listen for these events in a local, understandable manner.

Installation

npm install vue-parent-emit

Usage

  • Parent Component
    • Create an event source using myEventSource = newEventSource()
    • Pass as prop to child (e.g. :my-event="myEventSource")
  • Child Component
    • in setup(): useExternalEvent(props.myEvent, fetchSomeData) This registers an event listener when mounted.
    • or e.g. in mounted(): useExternalEvent(props.myEvent, fetchSomeData, {immediate: true}) This registers an event listener immediately.
    • The event listener will be deregistered automatically on unmount.
  • Somewhere in parent
    • emit events using e.g. myEventSource.emit('hello child!')
    • call emit() without a parameter, or use a single parameter to pass arbitrary data to the event listener(s)

See Usage Notes for further discussion.

Example

Also see a live sandbox example

Parent Component

// parent-component.vue
<template>
  <div>
    <ChildComponent :my-event="myEventSource" other-prop="hello" />
    <button @click="sendEvent">Notify child</button>
  </div>
</template>
<script>
import { defineComponent } from 'vue';
import { newEventSource } from 'vue-parent-emit';

export default defineComponent({
  // ...
  data() {
    return {
      // ...
      myEventSource: newEventSource(), // TS: newEventSource<MyEventPayload>()
    };
  },
  methods: {
    sendEvent() {
      // use this anywhere in the parent component
      this.myEventSource.emit();
      // or this.myEventSource.emit(someEventPayload)
    },
  },
});
</script>

Child Component (Composition API)

// child-component.vue
<template>
  <!-- child template -->
</template>
<script>
import { defineComponent } from 'vue';
import { useExternalEvent } from 'vue-parent-emit';
export default defineComponent({
  // ...
  props: {
    // ...
    myEvent: Object, // TS: as PropType<EventSource<MyEventPayload>>
  },
  setup(props) {
    const myData = ref("initial value");
    useExternalEvent(props.myEvent, (eventPayload) => fetchSomeData(myData, eventPayload));
    return { myData };
  },
});

function fetchSomeData(myData, eventPayload /*TS: :MyEventData*/) {
  // handle the event received from the parent, e.g.:
  console.log('child: fetching new data', eventPayload);
  myData.value = 'fetching ...';
}
</script>

Child Component (traditional Options API)

// child-component.vue
<template>
  <!-- child template -->
</template>
<script>
import { defineComponent } from 'vue';
import { useExternalEvent } from 'vue-parent-emit';
export default defineComponent({
  // ...
  props: {
    // ...
    myEvent: Object, // TS: as PropType<EventSource<MyEventPayload>>
  },
  mounted() {
    // register child event listener
    useExternalEvent(this.myEvent, this.fetchSomeData, {immediate: true});
  },
  methods: {
    fetchSomeData(eventPayload /*TS: :MyEventData*/) {
      // handle the event received from the parent, e.g.:
      console.log('child: fetching new data', eventPayload);
      this.myData = 'fetching ...';
  },
});
</script>

Usage Notes

Events don't replace props

Triggering actions, like re-fetching child data is a very good use-case for this mechanism. It is not (primarily) intended to pass data to the child. Props can do that just fine.

Most of the time you should not need an event payload at all.

Multiple event kinds

You can use a single event source for multiple kinds of events by passing in different payloads (this.myEventSource.emit('foo-event') and this.myEventSource.emit('bar-event')) and dispatch them according to the payload in the child component.

We however recommend to create multiple specific event sources instead. You will need to pass multiple props, but both emitting and handling the events is easier to understand this way. As an example, you could create two separate event sources and just invoke this.fooEvent.emit() or this.barEvent.emit() respectively.

Related Packages

vue-event-hub

a global event hub fro vue2

9,523
vue-e-bus

Simple event bus

35,620
vue-happy-bus

Event Bus for Vue2. automatically cancel listening events when destroyed.

3,727 105
vue-event-manager

The event manager for Vue.js

3,476 79
@fullcalendar/core

FullCalendar core types package

89,463,914 20,704

Version History

Version Released Vue License
3.1.2 ^3.5.13 MIT
3.1.1 ^3.5.13 MIT
3.1.0 ^3.5.13 MIT
3.0.0 ^3.2.31 MIT
1.1.0 ^2.7.8 MIT
Pre-releases (1)
Version Released Vue License
3.0.0-alpha.1 ^3.2.31 MIT