我正在创建一个模态窗口,我的任务是通过在此窗口外单击鼠标并按Esc键来关闭它,我已经执行了Esc,但我还没有弄清楚在窗口外的单击操作
gg0vcinb1#
您可以建立自订拦截,以侦测元件外部的按一下动作。要实现这一点,必须在React中使用useRef。下面是钩子的一个实现:
import { RefObject, useEffect } from 'react'; const useClickOutside = (ref: RefObject<HTMLDivElement>, handler: (e: Event) => void) => { useEffect(() => { let isStartedInside = false; let isStartedWhenMounted = false; const listener = (event: Event) => { // Do nothing if `mousedown` or `touchstart` started inside ref element if (isStartedInside || !isStartedWhenMounted) return; // Do nothing if clicking ref's element or descendent elements if (!ref.current || ref.current.contains(event.target as HTMLElement)) return; handler(event); }; const validateEventStart = (event: Event) => { isStartedWhenMounted = Boolean(ref.current); isStartedInside = Boolean(ref.current && ref.current.contains(event.target as HTMLElement)); listener(event); }; document.addEventListener('mousedown', validateEventStart); document.addEventListener('touchstart', validateEventStart); return () => { document.removeEventListener('mousedown', validateEventStart); document.removeEventListener('touchstart', validateEventStart); }; }, [ref, handler]); }; export default useClickOutside;
1条答案
按热度按时间gg0vcinb1#
您可以建立自订拦截,以侦测元件外部的按一下动作。
要实现这一点,必须在React中使用useRef。
下面是钩子的一个实现: