javascript - 在外部单击时隐藏侧边栏组件

标签 javascript html css reactjs

当用户单击焦点区域之外的任何位置时,尽我所能隐藏此侧边栏。
目前,当我点击外部时,侧边栏保持打开状态。如果我单击侧边栏中不是链接的区域,侧边栏将关闭。只是试图在应用程序的其他地方重新创建这种效果。
不知道在 React/JS 中实现这个
感谢您为我提供的任何帮助。

import React, { useState } from 'react';
import * as FaIcons from 'react-icons/fa';
import * as AiIcons from 'react-icons/ai';
import { Link } from 'react-router-dom';
import { NavbarData } from './NavbarData';
import '../styles/Navbar.css';
import { IconContext } from 'react-icons';
import onClickOutsideHOC from "react-onclickoutside"; //<-- Should I be using this?
function Navbar() {
  const [sidebar, setSidebar] = useState(false);

  const showSidebar = () => setSidebar(!sidebar);
  const hideSidebar = () => setSidebar(onClickOutsideHOC()); //<-- Should I be using this?
  return (
    <>
      <IconContext.Provider value={{ color: '#fff' }}>
        <div className='navbar'>
          <Link to='#' className='menu-bars'>
            <FaIcons.FaBars onClick={showSidebar} />
          </Link>
        </div>
        <nav className={sidebar ? 'nav-menu active' : 'nav-menu'}>
          <ul className='nav-menu-items' onClick={showSidebar}>
            <li className='navbar-toggle'>
              <Link to='#' className='menu-bars'>
                <AiIcons.AiOutlineClose />
              </Link>
            </li>
            {NavbarData.map((item, index) => {
              return (
                <li key={index} className={item.cName}>
                  <Link to={item.path}>
                    {item.icon}
                    <span>{item.title}</span>
                  </Link>
                </li>
              );
            })}
          </ul>
        </nav>


//Commented Out My Attempt Below

 {/*      <nav>
          <nav className={sidebar ? 'nav-menu inactive' : 'nav-menu'}>
            <ul className='nav-menu-items' onClick={hideSidebar}>
              <li className='navbar-toggle'>
                <Link to='#' className='menu-bars'>
                  <AiIcons.AiOutlineClose />
                </Link>
              </li>
              {NavbarData.map((item, index) => {
                return (
                    <li key={index} className={item.cName}>
                      <Link to={item.path}>
                        {item.icon}
                        <span>{item.title}</span>
                      </Link>
                    </li>
                );
              })}
            </ul>
          </nav>


        </nav>*/}
      </IconContext.Provider>
    </>
  );
}

export default Navbar;

最佳答案

为此,您可以创建一个自定义 Hook ,将您想要的元素作为参数。我为你创建了一个沙盒。
https://codesandbox.io/s/outside-click-hook-uc8bo
我们将元素的 ref 发送到我们创建的自定义钩子(Hook)。

const boxRef = useRef(null);
// boxOutsideClick will be true on outside click
const boxOutsideClick = OutsideClick(boxRef); 
<div ref={boxRef} className="box">
    <h1>Click outside of me</h1>
</div>
我们的钩子(Hook)看起来像这样:
export default function OutsideClick(ref) {
const [isClicked, setIsClicked] = useState();
useEffect(() => {
  function handleClickOutside(event) {
    if (ref.current && !ref.current.contains(event.target)) {
      setIsClicked(true);
    } else {
      setIsClicked(false);
    }
  }

  document.addEventListener("mousedown", handleClickOutside);
  return () => {
    document.removeEventListener("mousedown", handleClickOutside);
  };
}, [ref]);
  return isClicked;
}
OnMouseDown,我们检查被点击的地方是否在被选元素中,更新isClicked值并返回。

关于javascript - 在外部单击时隐藏侧边栏组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66626487/

相关文章:

php - 如何在 Twig 中调用 'time_diff' 过滤器

html - 如何更改链接列表的位置?

javascript - 如何通过单击包含其他视频源的链接来获取视频源 [Java 脚本]

javascript - Moment.js 返回 "December 31, 1969"

html - 使一个 DIV 滚动到另一个 DIV HTML 和 CSS 后面

javascript - 滚动时使导航栏保持位置

jquery - 在 JSP 中向表单添加弹出窗口

javascript - HTML - CSS 旋转 Div 未旋转 180 度

javascript - 当我说 "Step In"时,为什么 Firebug 不进入我的脚本?

javascript - 在 javascript 中对正则表达式进行分组