javascript - 点击 OutSide 关闭侧边栏 reactjs
问题描述
我在侧边栏外部单击时创建了一个函数,它将隐藏它,并且我还有一个按钮可以切换显示和隐藏侧边栏。但是当我将它们组合在一起时,按钮无法正常工作,它只显示侧边栏但无法关闭它,只有当我点击外部时它才会关闭侧边栏
点击 OutSide 关闭功能:
const ref = useRef(null);
useEffect(() => {
document.addEventListener("mousedown", Clickout);
return () => {
document.removeEventListener("mousedown", Clickout);
};
}, []);
const Clickout = (eve) => {
if (ref.current && !ref.current.contains(eve.target)) {
setShow(false);
}
};
我的回归:
return (
<header>
<div className="head">
<div className="logo">
<img src={logo} alt="logo" />
</div>
<button
className="burger"
onClick={() => {
setShow(!showMenu);
console.log("here");
}}
>
<div className={`${showMenu ? "change" : ""} bur1 `}></div>
<div className={`${showMenu ? "change" : ""} bur2 `}></div>
<div className={`${showMenu ? "change" : ""} bur3 `}></div>
</button>
</div>
<nav className={showMenu ? "active" : ""} ref={ref}>
<ul>
{navItem.map((item) => {
const { id, url, text } = item;
return (
<li key={id}>
<a href={url}>{text}</a>
</li>
);
})}
</ul>
</nav>
</header>
);
};
导航栏 CSS:
nav {
position: fixed;
right: -100%;
top: 0;
width: 60%;
height: 100vh;
text-align: center;
padding-top: 15vh;
transition: 0.8s ease;
background-color: blue;
}
nav.active {
right: 0;
transition: 0.5s;
}
谢谢你。
解决方案
以这种方式更新状态setShow(!showMenu)
不会立即更新状态。而是安排更新(您可以阅读文档)。当您setState
依赖于先前的状态(在这种情况下showMenu
取决于先前的状态)时,请使用此技术:(prev) => setState(!prev)
代替。因此,只需更新您的onClick
内容即可解决问题。
<button className="burger"
onClick={() => {
(prevShowMenu) => setShow(!prevShowMenu)
}}>
(如果这有帮助,请在评论中告诉我)
推荐阅读
- java - 将 excel 文件从 unix 服务器下载到 windows 客户端
- java - 如何创建一个在每次将新元素添加到 ArrayList 时触发的事件
- python - Django 2.2 不提供静态文件
- c++ - 将函数分配给函数指针,常量参数正确性?
- javascript - 如何在表格单元格中显示动态 html 内容(作为 html 页面预览)?
- javafx - AutoComplete javaFx ComboBox 项目在“清除选择”后不显示
- scala - 如何在不同的节点上并行处理不同的文件块?
- javascript - Recapcha V3 doesnt work on page with multiple forms
- java - 如何在整个代码中将 ImageView 源设置为内容提供者?
- javascript - 按不带名称的属性值选择节点