Skip to content

useEmitter

统一管理目标对象的事件监听,并在组件卸载时自动清理监听。

@movk-repo/shared/hooks/useEmitter

参数

ts
function useEmitter<R extends EventRegistry>(
  target: ShallowRef<EmitterTarget | undefined>,
  emit: EmitFunction,
  events?: EventInput<R>[],
): (() => void)[]

target

事件监听目标。

  • 类型: ShallowRef<EmitterTarget | undefined>
  • 描述: 事件监听器将被附加到此目标上。

emit

用于发射事件的函数。

  • 类型: EmitFunction
  • 描述: 接受事件名称及额外参数(例如将 "x.y" 转换为 "xY")。

events

可选的事件配置数组,每个事件可以为字符串或对象形式。

  • 类型: EventInput<R>[]
  • 描述:
    • 字符串形式表示事件名称;
    • 对象形式包含:
      • eventName: 事件名称
      • handler: 自定义回调函数(可选)
      • additionalArgs: 附加参数数组(可选)

示例

ts
import { useEmitter } from '@movk-repo/shared'
import { ref } from 'vue'

// 假设 target 实现了 on 和 off 方法
const targetRef = ref({
  on: (...args: any[]) => { /* 绑定事件 */ },
  off: (...args: any[]) => { /* 移除事件 */ },
})

function emitEvent(eventName: string, ...args: any[]) {
  console.log(`事件: ${eventName}`, ...args)
}

const cleanupFns = useEmitter(targetRef, emitEvent, [
  'click',
  {
    eventName: 'hover',
    handler: event => console.log('hover event', event),
    additionalArgs: ['arg1', 'arg2'],
  },
])

// cleanupFns 数组中的函数可用于手动解绑事件

基于 MIT 许可发布