Skip to content

useEventListener

Simple and intuitive way of declaring DOM event listeners.

Installation

npx rabbithook@latest add use-event-listener

Usage

App.tsx
import useEventListener from "@/hooks/use-event-listener";
function Component() {
const ref = useRef<HTMLDivElement>(null);
useEventListener("keydown", () => {
console.log("Window keydown event triggered");
});
useEventListener("keydown", () => {
console.log("Div keydown event triggered");
}, ref.current);
return (
<>
<div ref={ref} />
</>
)
}

Code

use-event-listener.ts
import { useEffect, useRef } from "react";
export type IEventMap = HTMLElementEventMap;
export type IEventElement = (Window & typeof globalThis) | Element | null;
function useEventListener<K extends keyof IEventMap>(
eventType: K,
callback: (ev: IEventMap[K]) => void,
element: IEventElement = window
) {
const callbackRef = useRef<(event: IEventMap[K]) => void>(callback);
useEffect(() => {
callbackRef.current = callback;
}, [callback]);
useEffect(() => {
const handler = (e: IEventMap[K]) => callbackRef.current(e);
element?.addEventListener(eventType as string, handler as EventListener);
return () => {
element?.removeEventListener(eventType as string, handler as EventListener);
};
}, [eventType, element]);
}
export default useEventListener;