无法读取 null 的属性“包含”

时间:2021-07-18 11:39:10

标签: javascript reactjs react-hooks

我有一个带有下拉菜单的基于 React 的应用程序,这个下拉菜单用作导航。我必须实现的是,当我在下拉菜单外单击时,应关闭下拉菜单。我尝试使用 useEffect 和 useRef。这是我的代码:

  useEffect( () => {
    const onClickOutsideNavbar = (event) => {
      if (ref.current.contains(event.target)) {
        return
      };

      setNavItemsOpen(false);
    };

    document.body.addEventListener("click", onClickOutsideNavbar)

    return () => {
      document.body.removeEventListener("click", onClickOutsideNavbar);
    }
  }, [])

我的 JSX 有一个 li,它呈现每个 nav item 和一个 ul 作为父项,还有一个 button 用于触发下拉列表和一个 div 包含所有这些。

一切正常,直到我添加了 react-router-dom 来链接我的页面。

<div ref= {ref}>
  <button onClick={handleNavToggle}>Trigger</button>
  <ul>
    <Link to="/navitem"><li>Nav Item</li></Link>
    <Link to=""><li>Nav Item</li></Link>
    <Link to=""><li>Nav Item</li></Link>
  </ul>
</div>

每当我点击第二个或第三个链接时,什么也没有发生。但是,如果我单击第一个将我带到 NavItem 的链接,那么我的 React 应用程序会在显示新组件 1 秒后崩溃。 错误是

<块引用>

无法读取 null 的属性“包含”。

如果有人知道这个错误背后的原因,请向我解释。

1 个答案:

答案 0 :(得分:1)

我认为您的 ref 在更改到新页面后可能是 undefined。所以 contains 方法是 null。我没有足够的信息来得出结论,但您可以使用 ?操作员以防止应用程序崩溃。

if (ref?.current?.contains(event.target)) {
        return
      };