Skip to content

useClickOutside

A React hook for detecting clicks outside a referenced element.


✨ Overview

useClickOutside lets you close dropdowns, modals, or popovers when the user clicks outside the target element.


📦 Import

tsx
import { useClickOutside } from 'react-hookstack';

🚀 Usage Example

tsx
import { useClickOutside } from 'react-hookstack';

function Example() {
  const ref = useRef(null);
  useClickOutside(ref, () => alert("Clicked outside!"));

  return (
    <div ref={ref}>Click outside me!</div>
  );
}

🧩 API Reference

useClickOutside(ref, handler, eventType?): void

Parameters

ParameterTypeDefaultDescription
refReact.RefObject<HTMLElement>Ref for target element.
handler(event: MouseEvent | TouchEvent) => voidCalled when click outside.
eventType"mousedown" | "mouseup" | "click" | "touchstart""mousedown"Event type to listen for.

⚙️ Implementation

tsx
export function useClickOutside<T extends HTMLElement | null = HTMLElement>(
    ref: React.RefObject<T>,
    handler: (event: MouseEvent | TouchEvent) => void,
    eventType: "mousedown" | "mouseup" | "click" | "touchstart" = "mousedown"
): void {
    useEffect(() => {
        const listener = (event: MouseEvent | TouchEvent) => {
            const el = ref?.current;
            // Do nothing if clicking inside the element or if it’s unmounted
            if (!el || el.contains(event.target as Node)) return;
            handler(event);
        };

        document.addEventListener(eventType, listener, true);
        return () => {
            document.removeEventListener(eventType, listener, true);
        };
    }, [ref, handler, eventType]);
}

export default useClickOutside;

💡 Notes

  • Supports mouse and touch events.
  • Useful for closing overlays and popups.

🧾 Type Definition

tsx
type UseClickOutside = (
  ref: React.RefObject<HTMLElement>,
  handler: (event: MouseEvent | TouchEvent) => void,
  eventType?: "mousedown" | "mouseup" | "click" | "touchstart"
) => void;

🧭 Summary

FeatureDescription
🖱️ Outside clickDetects outside clicks
⚡ LightweightMinimal overhead
🧩 Easy to useSimple API