useClickOutside
hookas/use-click-outsideFreeHook
A hook to handle click outside events
Install it
npx shadcn@latest add https://hookas.letstri.dev/r/use-click-outside.jsonSource
1'use client'23import * as React from 'react'45export function useClickOutside<T extends Element = Element>(6 ref: React.RefObject<T> | React.RefObject<T>[],7 handler: (event: MouseEvent | TouchEvent) => void,8 options?: { enabled?: boolean },9): void {10 const { enabled = true } = options ?? {}1112 const handlerEvent = React.useEffectEvent(handler)1314 React.useEffect(() => {15 if (!enabled)16 return1718 const abortController = new AbortController()1920 const handleClickAway = (event: MouseEvent | TouchEvent) => {21 const target = event.target as T22 const refs = Array.isArray(ref) ? ref : [ref]2324 const isClickAway = refs.every(r => r.current && !r.current.contains(target))2526 if (isClickAway) {27 handlerEvent(event)28 }29 }3031 document.addEventListener('mousedown', handleClickAway, { signal: abortController.signal })32 document.addEventListener('touchstart', handleClickAway, { signal: abortController.signal })3334 return () => {35 abortController.abort()36 }37 }, [ref, enabled])38}
Files it writes
More from hookas
All 30 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| useAsyncEffectuse-async-effect | hookas | Hooks | Free | no deps | |
| useDebounceCallbackuse-debounced-callback | hookas | Hooks | Free | no deps | |
| useDebounceMemouse-debounced-memo | hookas | Hooks | Free | no deps | |
| useDebounceStateuse-debounced-state | hookas | Hooks | Free | no deps | |
| useElementSizeuse-element-size | hookas | Hooks | Free | no deps | |
| useFullscreenuse-fullscreen | hookas | Hooks | Free | no deps | |
| useIntervaluse-interval | hookas | Hooks | Free | no deps | |
| useIsInViewportuse-is-in-viewport | hookas | Hooks | Free | no deps |
