Skip to content

useEventForwarder

创建一个自动转发事件的对象,将事件委托给提供的 emit 函数,并允许对指定事件应用自定义处理逻辑。

@movk-repo/shared/hooks/useEventForwarder

参数

ts
function useEventForwarder<
  T extends Record<string, (...args: any[]) => any>,
  E extends (...args: any[]) => any,
>(
  emit: E,
  emitsDef: T,
  customHandlers?: Partial<{ [K in keyof T]: (...args: Parameters<T[K]>) => void }>,
): { [K in keyof T]: (...args: Parameters<T[K]>) => void }

emit

用于触发事件的函数,例如 Vue 的 defineEmits 返回的函数。

  • 类型: 函数 E
  • 描述: 接受事件名称及对应参数,负责触发事件。

emitsDef

事件定义对象。

  • 类型: T(对象类型,所有事件名称及对应的触发函数)
  • 描述: 包含所有事件名称,并为类型推导提供支持。

customHandlers

可选的自定义事件处理器对象,用于覆盖默认的事件转发逻辑。

  • 类型: Partial<{ [K in keyof T]: (...args: Parameters<T[K]>) => void }>
  • 描述: 指定某些事件的特殊处理逻辑。如果对应事件存在自定义处理器,则使用该逻辑而非默认转发。

示例

ts
import { useEventForwarder } from '@movk-repo/shared'
import { defineEmits } from 'vue'

const myEmits = {
  add: (_payload: any) => true,
  remove: (_payload: any) => true,
} as const

const emit = defineEmits(myEmits)

// 使用 useEventForwarder 生成事件转发器,支持自定义处理器
const forwardedEvents = useEventForwarder(emit, myEmits, {
  add: (payload) => {
    console.log('Custom handler for add event', payload)
    emit('add', payload)
  }
})

// 在模板中将 forwardedEvents 传给 v-on
// <MyComponent v-on="forwardedEvents" />

基于 MIT 许可发布