javascript - 检测 div 外的点击并切换菜单
问题描述
我有一个切换菜单,我正在尝试检测菜单外的点击事件以便能够关闭菜单,当用户在菜单外单击时我可以关闭菜单,但是要再次打开菜单,您必须单击两次,有谁知道我必须做些什么来解决这个问题,(菜单应该一键打开)
const RightMenu = ({ t, history }) => {
let [menuOpen, setMenuOpen] = useState(false);
const menuDiv = useRef({});
const toggleMenu = useRef();
useEffect(() => {
window.addEventListener("click", () => {
if ((menuDiv.current.style.display = "block")) {
menuDiv.current.style.display = "none";
}
});
return () => {
window.removeEventListener("click", () => {});
};
}, []);
const handleClick = e => {
e.stopPropagation();
if (menuOpen === false) {
menuDiv.current.style.display = "block";
setMenuOpen(true);
}
if (menuOpen === true) {
menuDiv.current.style.display = "none";
setMenuOpen(false);
}
};
return (
<div>
<div
id="menu"
ref={menuDiv}
style={{
display: "none"
}}
>Menu items</div>
<div
className="text-center"
ref={toggleMenu}
onClick={e => handleClick(e)}
> Menu Button</div>
)
}
解决方案
当您的组件卸载时,您实际上并没有从窗口中删除事件侦听器。的第二个参数removeEventListener
应该是对您添加的同一个函数的引用addRemoveListener
。例如
useEffect(() => {
const closeMenu = () => {
if ((menuDiv.current.style.display = "block")) {
menuDiv.current.style.display = "none";
}
};
window.addEventListener("click", closeMenu);
return () => {
window.removeEventListener("click", closeMenu);
};
}, []);
推荐阅读
- java - 如何修改jar包代码然后重新导出更新的jar包?
- c# - Azure Pipeline 部署到 Web 应用服务失败,缺少必需的属性“OutputPath”
- c# - 尽管在默认图标部分放置了一张图片,但该图片并没有作为我游戏的图标出现。我应该怎么办?
- r - 使用 nnet() 权重进行外部预测
- maven - 运行 maven install 命令时出现“无法解析依赖项”错误
- android - 如何在android改造中发送json数组?
- c++ - 在同一地图的迭代中更改地图中的值(嵌套迭代器)C ++
- javascript - object["#"] 已定义且未定义?
- python-3.x - 在 aws boto3 上传中获取进度回调
- javascript - Including Javascript code from a JSP file