create-event-hook
Create a small, strongly typed event emitter.
| Package | @vizejs/composable/create-event-hook |
| Own the source | vize lib pull composable:create-event-hook |
| Runtime exports | createEventHook |
| Gzip budget | 1792 B |
Usage
import { createEventHook } from "@vizejs/composable/create-event-hook";
Runtime contract
| Utility | Category | Stability | SSR | Hydration | Cleanup | Targets | Host globals | Uses |
|---|---|---|---|---|---|---|---|---|
createEventHook |
events | experimental | safe | not-applicable | returned-value, reactive-scope | web, server, worker, native, desktop, terminal | console, process, window |
tryOnScopeDispose |
API
createEventHook
Create a small, strongly typed event emitter. The payload is a tuple type, so events can carry several named arguments (createEventHook<[id: string, value: number]>()) and trigger checks them. Listeners registered inside an effect scope unsubscribe themselves when it stops. Synchronous listener errors propagate from trigger; async rejections reject the returned promise. SSR: Vue does not dispose component scopes after a server render, so a listener that a server setup adds to a module-level hook would never be removed and would pile up once per request. By default such registrations are therefore skipped (with a one-time development warning); see CreateEventHookOptions.serverListeners. Hooks created inside a component, and every registration in the browser, behave normally.
function createEventHook<Arguments extends readonly unknown[] = []>( options: CreateEventHookOptions = {}, ): EventHook<Arguments>
const saved = createEventHook<[id: string]>();
saved.on((id) => toast(`Saved ${id}`));
await saved.trigger("doc-1");
Types
EventHookSubscription
Registration handle returned by EventHook.on.
| Member | Type | Description |
|---|---|---|
off |
() => void |
Remove the listener. Idempotent. |
CreateEventHookOptions
Options for createEventHook.
| Member | Type | Description |
|---|---|---|
serverListeners? |
"ignore" | "register" |
What on() does when a hook created outside any component (a module-level hook shared by every request) is subscribed to from a component setup during server rendering. Vue never disposes server component scopes, so such listeners would accumulate across requests and keep every rendered component alive. - "ignore": skip the registration (the returned off is a no-op) and warn once in development. - "register": register anyway; the caller must call off(). Hooks created inside a component (request-local hooks) are unaffected. |
EventHook
Typed event emitter created by createEventHook.
| Member | Type | Description |
|---|---|---|
on |
(listener: EventHookListener<Arguments>) => EventHookSubscription |
Add a listener. Inside an effect scope it is removed automatically when the scope stops. Adding the same function twice registers it once. |
off |
(listener: EventHookListener<Arguments>) => void |
Remove a listener. |
trigger |
(...args: Arguments) => Promise<unknown[]> |
Call every listener with args, in registration order. |
clear |
() => void |
Remove every listener. |
size |
() => number |
Number of registered listeners. |