javascript - 检测点击外部 react 父组件

标签 javascript reactjs

如何知道用户在我们指向的 React 应用之外点击了

<div id="root">

(我有额外的空间来点击根 div 之外)

我试过下面的代码

import ReactDOM from 'react-dom';
// ... ✂

componentDidMount() {
    document.addEventListener('click', this.handleClickOutside, true);
}

componentWillUnmount() {
    document.removeEventListener('click', this.handleClickOutside, true);
}

handleClickOutside = event => {
    const domNode = ReactDOM.findDOMNode(this);

    if (!domNode || !domNode.contains(event.target)) {
        this.setState({
            visible: false
        });
    console.log("clicked outside")
    }
}

但是,即使我在父项下的某个子弹出组件中单击,它也显示为“在外部单击”

如果我点击应用内的任何地方(包括子组件),它不应该说“点击外部”

那么有什么方法可以知道用户点击了整个应用本身以外的地方吗?

最佳答案

最简单的方法是为应用程序容器(树中最外层的元素)设置一个监听器,而不是寻找 id="root" 元素。

因此,对于给定的 index.html:

<div id="root"></div>
<div>Div which outside of app</div>

可能的实现可以是(检查日志):

function useOnClickOutside(ref, handler) {
  useEffect(() => {
    const listener = event => {
      if (!ref.current || ref.current.contains(event.target)) {
        return;
      }

      handler(event);
    };

    document.addEventListener("mousedown", listener);
    document.addEventListener("touchstart", listener);

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

const App = () => {
  const divRef = useRef();
  const handler = useCallback(() => console.log(`Click Outside`), []);
  useOnClickOutside(divRef, handler);

  return (
    <div
      ref={divRef}
      style={{
        margin: `0.5rem`,
        padding: `1rem`,
        border: `2px solid black`,
        cursor: `pointer`
      }}
    >
      Application
    </div>
  );
};

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById("root")
);

Edit currying-dust-cpscu

关于javascript - 检测点击外部 react 父组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62128224/

相关文章:

javascript - jQuery 数据表 - 如何使用 filter()?

javascript - redux reducer 的多个键

javascript - 如果单击链接后解决了某些异步条件,是否有一种可访问的方式告诉用户界面的某些部分可以重定向到其他页面?

javascript - 如何使用 IntersectionObserver 使 React 组件在滚动时淡入,但只有一次?

javascript - 如何在React中调用api之前设置状态

javascript - 为什么在 Facebook Flux 上使用 Redux?

javascript - 验证测验的单选按钮

javascript - 如何用最少的代码行一次显示一个 div?

javascript - 隐藏不属于某个类的元素

javascript - Codility "PermMissingElem"Javascript 解决方案