React hook to detect clicks outside of a specified component.
Add the hook via the CLI:
npx @novajslabs/cli add useOutsideClick
Or copy and paste the code into your project:
import { useEffect, MutableRefObject } from 'react'
export const useOutsideClick = (
ref: MutableRefObject<HTMLElement | null>,
fn: () => void,
) => {
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
if (ref.current && !ref.current.contains(event.target as Node)) {
fn()
}
}
document.addEventListener('click', handleClickOutside)
return () => {
document.removeEventListener('click', handleClickOutside)
}
}, [ref, fn])
}
React 16.8 or higher
- Name
ref
- Type
- HTMLElement | null
- Required
- required
- Description
The DOM element to detect clicks outside of.
- Name
fn
- Type
- function
- Required
- required
- Description
A callback function to execute when a click outside the referenced element is detected.
import { useState, useRef } from 'react'
import { useOutsideClick } from './hooks/useOutsideClick'
const DropdownMenu = () => {
const [isOpen, setIsOpen] = useState(false)
const dropdownRef = useRef<HTMLDivElement>(null)
const toggleMenu = () => {
setIsOpen(!isOpen)
}
const closeMenu = () => {
setIsOpen(false)
}
useOutsideClick(dropdownRef, closeMenu)
return (
<div ref={dropdownRef}>
<button onClick={toggleMenu}>Toggle Dropdown</button>
{isOpen && (
<div>
<ul>
<li>Option 1</li>
<li>Option 2</li>
<li>Option 3</li>
</ul>
</div>
)}
</div>
)
}
export default DropdownMenu
Here are some use cases where this React hook is useful:
- Closing dropdown menus when clicking outside
- Dismissing modal dialogs when clicking outside
- Hiding context menus on outside click