Skip to content

event

事件工具函数。

导入

typescript
import { createEventHook } from '@cloudcome/utils-vue/event';
import type { EventEmitter, CreateEventCenterOptions } from '@cloudcome/utils-vue/event';

类型定义

EventEmitter

typescript
interface EventEmitter {
  on: (event: string, listener: (...payloads: unknown[]) => unknown) => unknown;
  off: (event: string, listener: (...payloads: unknown[]) => unknown) => unknown;
  emit: (event: string, ...payloads: unknown[]) => unknown;
}

CreateEventCenterOptions

typescript
interface CreateEventCenterOptions {
  emitter?: EventEmitter;
  stage?: 'mount' | 'mounted';
}

属性说明

属性类型默认值描述
emitterEventEmitter-自定义事件发射器。提供时,on/off/emit 会代理到该发射器
stage'mount' | 'mounted''mounted'useEvent 自动注册事件的生命周期阶段。'mount'onBeforeMount 注册,'mounted'onMounted 注册。组件卸载时自动移除监听

函数

createEventHook

创建事件钩子。

typescript
function createEventHook<E extends EmitterMap>(
  options?: CreateEventCenterOptions,
): {
  on: <K extends keyof E>(event: K, listener: E[K]) => void;
  off: <K extends keyof E>(event: K, listener: E[K]) => void;
  emit: <K extends keyof E>(event: K, ...payloads: E[K]) => void;
  useEvent: <K extends keyof E>(event: K, listener: E[K]) => void;
};

参数

参数类型描述
optionsCreateEventCenterOptions可选配置

返回值

包含 onoffemituseEvent 方法的对象

示例

typescript
// 定义事件类型(使用元组声明参数列表)
interface MyEvents {
  message: [text: string];
  error: [error: Error];
}

// 创建事件钩子
const { on, off, emit, useEvent } = createEventHook<MyEvents>();

// 监听事件
on('message', (text) => {
  console.log('收到消息:', text);
});

// 触发事件
emit('message', 'Hello!');

// 取消监听
const handler = (text: string) => {
  console.log(text);
};
on('message', handler);
off('message', handler);

// 在组件中使用(自动清理)
useEvent('message', (text) => {
  console.log('组件中的监听:', text);
});

在组件中使用

typescript
import { createEventHook } from '@cloudcome/utils-vue/event'

// 创建全局事件中心(使用元组声明参数列表)
interface MessageEvents {
  message: [text: string]
}
const messageEvent = createEventHook<MessageEvents>()

// 组件 A:发送消息
const sendMessage = () => {
  messageEvent.emit('message', 'Hello from A!')
}

// 组件 B:接收消息
messageEvent.useEvent('message', (text) => {
  console.log('收到消息:', text)
})

// useEvent 自动清理:组件卸载后监听器自动移除
// 以下示例中,组件卸载后再 emit 不会触发已卸载组件的监听器
const wrapper = mount({
  setup() {
    eventCenter.useEvent('test-event', listener)
  }
})
eventCenter.emit('test-event', 'hello', 123)
// listener 被调用 1 次

wrapper.unmount() // 组件卸载,监听器自动移除

eventCenter.emit('test-event', 'world', 456)
// listener 不再被调用(仍为 1 次)

// 使用自定义事件发射器
const customEmitter = {
  on: (event, listener) => /* 自定义注册逻辑 */,
  off: (event, listener) => /* 自定义移除逻辑 */,
  emit: (event, ...payloads) => /* 自定义触发逻辑 */
}
const eventCenter = createEventHook<TestEvents>({ emitter: customEmitter })
// on/off/emit 调用会代理到 customEmitter

基于 MIT 许可发布