Skip to content

useEventListener

通用事件监听器管理 Hook,提供统一的事件监听器管理功能,支持多种目标类型和自动生命周期管理。

基础用法

最简单的用法是监听元素的点击事件。

点击我 (0)

监听窗口事件

可以监听全局事件,如窗口大小变化。

窗口大小: 0 × 0

实际应用场景

键盘事件处理

最后按键: 无

鼠标悬停效果

鼠标移入试试

条件监听

监听已禁用

点击次数: 0

手动控制监听器

监听已禁用

点击次数: 0

API

参数

参数名类型默认值说明
targetEventTargetRef-事件目标,支持响应式引用或函数
eventstring-事件名称
handlerEventHandler<T>-事件处理函数
optionsUseEventListenerOptions{}配置选项

配置选项

选项名类型默认值说明
immediatebooleantrue是否立即添加监听器
autoRemovebooleantrue是否在组件卸载时自动移除监听器
passiveboolean-是否为被动监听器
captureboolean-是否在捕获阶段处理事件
onceboolean-是否只触发一次

返回值

返回一个数组,包含以下元素:

索引类型说明
0AddListenerFunction手动添加事件监听器的函数
1RemoveListenerFunction手动移除事件监听器的函数
2SetEnabledFunction启用/禁用事件监听器的函数

类型定义

ts
/**
 * 事件监听器的目标类型
 */
export type EventTarget = Window | Document | HTMLElement | null;

/**
 * 事件监听器的目标引用类型
 */
export type EventTargetRef = Ref<EventTarget> | (() => EventTarget);

/**
 * 通用事件处理函数类型
 */
export type EventHandler<T extends Event = Event> = (event: T) => void;

/**
 * 添加事件监听器的函数类型
 */
export type AddListenerFunction = () => void;

/**
 * 移除事件监听器的函数类型
 */
export type RemoveListenerFunction = () => void;

/**
 * useEventListener 钩子函数的返回值类型
 */
export type UseEventListenerReturn = [
  /** 手动添加事件监听器的函数 */
  AddListenerFunction,
  /** 手动移除事件监听器的函数 */
  RemoveListenerFunction,
  /** 启用/禁用事件监听器的函数 */
  SetEnabledFunction,
];

/**
 * 事件监听器配置选项
 */
export interface UseEventListenerOptions extends AddEventListenerOptions {
  /** 是否立即添加监听器,默认为 true */
  immediate?: boolean;
  /** 是否在组件卸载时自动移除监听器,默认为 true */
  autoRemove?: boolean;
}

/**
 * 通用事件监听器管理 Hook
 * @param target - 事件目标,支持响应式引用或函数
 * @param event - 事件名称
 * @param handler - 事件处理函数
 * @param options - 配置选项
 * @returns 返回包含控制函数的数组
 * @example
 * ```typescript
 * // 基础用法
 * const [addListener, removeListener, setEnabled] = useEventListener(
 *   buttonRef,
 *   'click',
 *   () => console.log('clicked')
 * );
 *
 * // 监听窗口事件
 * const [, , setResizeEnabled] = useEventListener(
 *   window,
 *   'resize',
 *   () => console.log('resized'),
 *   { passive: true }
 * );
 *
 * // 条件监听
 * const [, , setEnabled] = useEventListener(
 *   elementRef,
 *   'scroll',
 *   handleScroll,
 *   { immediate: false }
 * );
 * ```
 */
export function useEventListener<T extends Event = Event>(
  target: EventTargetRef,
  event: string,
  handler: EventHandler<T>,
  options?: UseEventListenerOptions,
): UseEventListenerReturn;

注意事项

  1. 目标类型: 支持 WindowDocumentHTMLElement 等多种目标类型
  2. 响应式目标: 当目标元素发生变化时,会自动重新绑定事件监听器
  3. 生命周期管理: 默认在组件卸载时自动清理监听器,防止内存泄漏
  4. 性能优化: 使用 setEnabled 可以动态启用/禁用监听器,避免不必要的事件处理
  5. 类型安全: 完整的 TypeScript 类型支持,提供良好的开发体验
  6. 选项配置: 支持所有原生 addEventListener 的选项,如 passivecaptureonce

基于 MIT 协议发布