Skip to content

⬅️ Back to Table of Contents

📄 useEventBus

📊 Analysis Summary

Metric Count
🔧 Functions 8
📦 Imports 3
📐 Interfaces 2
📑 Type Aliases 3

📚 Table of Contents

🛠️ File Location:

📂 packages/core/useEventBus/index.ts

📦 Imports

Name Source
Fn @vueuse/shared
tryOnScopeDispose @vueuse/shared
events ./internal

Functions

useEventBus(key: EventBusIdentifier<T>): UseEventBusReturn<T, P>

Parameters:

  • key EventBusIdentifier<T>

Returns: UseEventBusReturn<T, P>

Calls:

  • events.get
  • listeners.add
  • events.set
  • off
  • tryOnScopeDispose (from @vueuse/shared)
  • listener
  • on
  • listeners.delete
  • reset
  • events.delete
  • events.get(key)?.forEach
  • v

Internal Comments:

// auto unsubscribe when scope get disposed (x3)
// @ts-expect-error cast (x3)

Code
export function useEventBus<T = unknown, P = any>(key: EventBusIdentifier<T>): UseEventBusReturn<T, P> {
  function on(listener: EventBusListener<T, P>) {
    const listeners = (events.get(key) || new Set())
    listeners.add(listener)
    events.set(key, listeners)

    const _off = () => off(listener)
    // auto unsubscribe when scope get disposed
    tryOnScopeDispose(_off)
    return _off
  }

  function once(listener: EventBusListener<T, P>) {
    function _listener(...args: any[]) {
      off(_listener)
      // @ts-expect-error cast
      listener(...args)
    }
    return on(_listener)
  }

  function off(listener: EventBusListener<T>): void {
    const listeners = events.get(key)
    if (!listeners)
      return

    listeners.delete(listener)

    if (!listeners.size)
      reset()
  }

  function reset() {
    events.delete(key)
  }

  function emit(event?: T, payload?: P) {
    events.get(key)?.forEach(v => v(event, payload))
  }

  return { on, once, off, emit, reset }
}

Internal helpers

Declared inside another function in this file.

on(listener: EventBusListener<T, P>): () => void

Parameters:

  • listener EventBusListener<T, P>

Returns: () => void

Calls:

  • events.get
  • listeners.add
  • events.set
  • off
  • tryOnScopeDispose (from @vueuse/shared)

Internal Comments:

// auto unsubscribe when scope get disposed (x3)

Code
function on(listener: EventBusListener<T, P>) {
    const listeners = (events.get(key) || new Set())
    listeners.add(listener)
    events.set(key, listeners)

    const _off = () => off(listener)
    // auto unsubscribe when scope get disposed
    tryOnScopeDispose(_off)
    return _off
  }

_off(): void

Returns: void

Calls:

  • off
Code
() => off(listener)

once(listener: EventBusListener<T, P>): () => void

Parameters:

  • listener EventBusListener<T, P>

Returns: () => void

Calls:

  • off
  • listener
  • on

Internal Comments:

// @ts-expect-error cast (x3)

Code
function once(listener: EventBusListener<T, P>) {
    function _listener(...args: any[]) {
      off(_listener)
      // @ts-expect-error cast
      listener(...args)
    }
    return on(_listener)
  }

_listener(args: any[]): void

Parameters:

  • args any[]

Returns: void

Calls:

  • off
  • listener

Internal Comments:

// @ts-expect-error cast (x3)

Code
function _listener(...args: any[]) {
      off(_listener)
      // @ts-expect-error cast
      listener(...args)
    }

off(listener: EventBusListener<T>): void

Parameters:

  • listener EventBusListener<T>

Returns: void

Calls:

  • events.get
  • listeners.delete
  • reset
Code
function off(listener: EventBusListener<T>): void {
    const listeners = events.get(key)
    if (!listeners)
      return

    listeners.delete(listener)

    if (!listeners.size)
      reset()
  }

reset(): void

Returns: void

Calls:

  • events.delete
Code
function reset() {
    events.delete(key)
  }

emit(event: T, payload: P): void

Parameters:

  • event T
  • payload P

Returns: void

Calls:

  • events.get(key)?.forEach
  • v
Code
function emit(event?: T, payload?: P) {
    events.get(key)?.forEach(v => v(event, payload))
  }

Interfaces

EventBusKey<T>

Interface Code
export interface EventBusKey<T> extends Symbol { }

UseEventBusReturn<T, P>

Interface Code
export interface UseEventBusReturn<T, P> {
  /**
   * Subscribe to an event. When calling emit, the listeners will execute.
   * @param listener watch listener.
   * @returns a stop function to remove the current callback.
   */
  on: (listener: EventBusListener<T, P>) => Fn
  /**
   * Similar to `on`, but only fires once
   * @param listener watch listener.
   * @returns a stop function to remove the current callback.
   */
  once: (listener: EventBusListener<T, P>) => Fn
  /**
   * Emit an event, the corresponding event listeners will execute.
   * @param event data sent.
   */
  emit: (event?: T, payload?: P) => void
  /**
   * Remove the corresponding listener.
   * @param listener watch listener.
   */
  off: (listener: EventBusListener<T>) => void
  /**
   * Clear all events
   */
  reset: () => void
}

Properties

Name Type Optional Description
on (listener: EventBusListener<T, P>) => Fn not shown
once (listener: EventBusListener<T, P>) => Fn not shown
emit (event?: T, payload?: P) => void not shown
off (listener: EventBusListener<T>) => void not shown
reset () => void not shown

Type Aliases

EventBusListener<T = unknown, P = any>

type EventBusListener<T = unknown, P = any> = (event: T, payload?: P) => void;

EventBusEvents<T, P = any>

type EventBusEvents<T, P = any> = Set<EventBusListener<T, P>>;

EventBusIdentifier<T = unknown>

type EventBusIdentifier<T = unknown> = EventBusKey<T> | string | number;

Generated by Syntax Scribe