VayuUI

useOnClickOutside

A hook that handles clicking outside of a specified element.

The useOnClickOutside hook allows you to detect clicks outside of a specific element (referenced by a ref). This is commonly used for closing modals, dropdowns, or popovers when the user clicks elsewhere on the page.

Demo

Source Code

Copy this code into src/hooks/useOnClickOutside.ts:

import { useEffect, RefObject } from 'react';

type EventType = MouseEvent | TouchEvent | PointerEvent;

export const useOnClickOutside = (
  ref: RefObject<HTMLElement>,
  handler: (event: EventType) => void,
) => {
  useEffect(() => {
    const listener = (event: EventType) => {
      // Do nothing if clicking ref's element or descendant elements
      if (!ref.current || ref.current.contains(event.target as Node)) {
        return;
      }
      handler(event);
    };

    document.addEventListener('mousedown', listener);
    document.addEventListener('touchstart', listener);
    document.addEventListener('pointerdown', listener);

    return () => {
      document.removeEventListener('mousedown', listener);
      document.removeEventListener('touchstart', listener);
      document.removeEventListener('pointerdown', listener);
    };
  }, [ref, handler]);
};

Usage

import { useState, useRef } from 'react';
import { useOnClickOutside } from '@/hooks/useOnClickOutside';

const Dropdown = () => {
  const [isOpen, setIsOpen] = useState(false);
  const ref = useRef(null);

  useOnClickOutside(ref, () => setIsOpen(false));

  return (
    <div>
      <button onClick={() => setIsOpen(true)}>Open Dropdown</button>

      {isOpen && (
        <div ref={ref} className="dropdown-menu">
          <p>Dropdown content</p>
        </div>
      )}
    </div>
  );
};

API Reference

Parameters

NameTypeDescription
refRefObject<HTMLElement>A ref identifying the element to detect outside clicks for.
handler(event: MouseEvent | TouchEvent | PointerEvent) => voidA callback function to execute when a click outside the element is detected.

On this page