Skip to content

useEventListener()

useEventListener<KW, KH, KM, T>(eventName, handler, element?, options?, debounce?): void

Defined in: hooks/dom/useEventListener.ts:55

A React hook for attaching an event listener to a target element with automatic cleanup. It supports DOM elements, window, document, and MediaQueryList, and optionally debounces the handler.

Type Parameters

KW

KW extends keyof WindowEventMap

Keys of WindowEventMap.

KH

KH extends "error" | "toggle" | "abort" | "animationcancel" | "animationend" | "animationiteration" | "animationstart" | "auxclick" | "beforeinput" | "beforematch" | "beforetoggle" | "blur" | "cancel" | "canplay" | "canplaythrough" | "change" | "click" | "close" | "compositionend" | "compositionstart" | "compositionupdate" | "contextlost" | "contextmenu" | "contextrestored" | "copy" | "cuechange" | "cut" | "dblclick" | "drag" | "dragend" | "dragenter" | "dragleave" | "dragover" | "dragstart" | "drop" | "durationchange" | "emptied" | "ended" | "focus" | "focusin" | "focusout" | "formdata" | "gotpointercapture" | "input" | "invalid" | "keydown" | "keypress" | "keyup" | "load" | "loadeddata" | "loadedmetadata" | "loadstart" | "lostpointercapture" | "mousedown" | "mouseenter" | "mouseleave" | "mousemove" | "mouseout" | "mouseover" | "mouseup" | "paste" | "pause" | "play" | "playing" | "pointercancel" | "pointerdown" | "pointerenter" | "pointerleave" | "pointermove" | "pointerout" | "pointerover" | "pointerrawupdate" | "pointerup" | "progress" | "ratechange" | "reset" | "resize" | "scroll" | "scrollend" | "securitypolicyviolation" | "seeked" | "seeking" | "select" | "selectionchange" | "selectstart" | "slotchange" | "stalled" | "submit" | "suspend" | "timeupdate" | "touchcancel" | "touchend" | "touchmove" | "touchstart" | "transitioncancel" | "transitionend" | "transitionrun" | "transitionstart" | "volumechange" | "waiting" | "webkitanimationend" | "webkitanimationiteration" | "webkitanimationstart" | "webkittransitionend" | "wheel" | "fullscreenchange" | "fullscreenerror"

Keys shared by HTMLElementEventMap and SVGElementEventMap.

KM

KM extends "change"

Keys of MediaQueryListEventMap.

T

T extends typeof globalThis | Document | HTMLElement | MediaQueryList | SVGElement = HTMLElement

Type of the target element.

Parameters

eventName

The name of the event to listen for (e.g. 'click', 'resize').

KW | KH | KM

handler

(event) => void

The callback function to handle the event.

element?

RefObject<T>

The target element ref. Defaults to window when not provided.

options?

Options passed to addEventListener.

boolean | AddEventListenerOptions

debounce?

number

Debounce delay in milliseconds. 0 or undefined disables debouncing.

Returns

void

Examples

ts
// Window resize with debounce
useEventListener('resize', () => {
  console.log('Window resized');
}, undefined, undefined, 300);
ts
// Button click
const buttonRef = useRef<HTMLButtonElement>(null);
useEventListener('click', () => {
  console.log('Button clicked');
}, buttonRef);
ts
// Document keydown
const documentRef = useRef<Document>(document);
useEventListener('keydown', (event) => {
  console.log('Key pressed:', event.key);
}, documentRef, { capture: true });
ts
// Media query change
const mediaQueryListRef = useRef(window.matchMedia('(max-width: 600px)'));
useEventListener(
  'change',
  (event) => {
    console.log('Media query matches:', event.matches);
  },
  mediaQueryListRef
);

Released under the MIT License.