reactjs 你好,告诉我在这段代码中写什么,以及在模态外单击鼠标时在哪里关闭模态

ogq8wdun  于 2022-11-29  发布在  React
关注(0)|答案(1)|浏览(94)

我正在创建一个模态窗口,我的任务是通过在此窗口外单击鼠标并按Esc键来关闭它,我已经执行了Esc,但我还没有弄清楚在窗口外的单击操作

gg0vcinb

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;

相关问题