Skip to content

Instantly share code, notes, and snippets.

@Soumyarian98
Created November 7, 2024 05:53
Show Gist options
  • Select an option

  • Save Soumyarian98/acf606cc35bfa9393361588c94d94d3b to your computer and use it in GitHub Desktop.

Select an option

Save Soumyarian98/acf606cc35bfa9393361588c94d94d3b to your computer and use it in GitHub Desktop.
import { useEffect, useRef, useState } from "react";
export function useEventListener<K extends keyof HTMLElementEventMap>(
eventName: K,
handler: (event: HTMLElementEventMap[K]) => void,
element: HTMLElement | Window = window
) {
const savedHandler = useRef<(event: HTMLElementEventMap[K]) => void>();
useEffect(() => savedHandler.current = handler, [handler]);
useEffect(() => {
if (!element || !element.addEventListener) return;
const eventListener = (event: Event) => {
if (savedHandler.current)
savedHandler.current(event as HTMLElementEventMap[K]);
};
element.addEventListener(eventName, eventListener);
return () => {
element.removeEventListener(eventName, eventListener);
};
}, [eventName, element]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment