我正在使用材料界面菜单。它应该工作,因为它是,但只是使用鼠标悬停,而不是点击。这里是我的代码链接:https://codesandbox.io/embed/vn3p5j40m0
下面是我试过的代码。它可以正确打开,但是当鼠标移开时不会关闭。
import React from "react";
import Button from "@material-ui/core/Button";
import Menu from "@material-ui/core/Menu";
import MenuItem from "@material-ui/core/MenuItem";
function SimpleMenu() {
const [anchorEl, setAnchorEl] = React.useState(null);
function handleClick(event) {
setAnchorEl(event.currentTarget);
}
function handleClose() {
setAnchorEl(null);
}
return (
<div>
<Button
aria-owns={anchorEl ? "simple-menu" : undefined}
aria-haspopup="true"
onClick={handleClick}
onMouseEnter={handleClick}
>
Open Menu
</Button>
<Menu
id="simple-menu"
anchorEl={anchorEl}
open={Boolean(anchorEl)}
onClose={handleClose}
onMouseLeave={handleClose}
>
<MenuItem onClick={handleClose}>Profile</MenuItem>
<MenuItem onClick={handleClose}>My account</MenuItem>
<MenuItem onClick={handleClose}>Logout</MenuItem>
</Menu>
</div>
);
}
export default SimpleMenu;
5条答案
按热度按时间cuxqih211#
下面的代码看起来工作得很合理。与你的沙盒相比,主要的变化是在按钮上使用
onMouseOver={handleClick}
而不是onMouseEnter
。如果没有这个变化,如果鼠标不在菜单的某一部分上,它将无法可靠地打开。另一个更改是使用MenuListProps={{ onMouseLeave: handleClose }}
。直接在Menu
上使用onMouseLeave
不会不起作用,因为菜单包括一个覆盖层,作为利用Modal
的菜单的一部分,鼠标永远不会“离开”覆盖层。MenuList
是菜单中显示菜单项的部分。v9tzhpje2#
我已经更新了Ryan的原始答案,以修复当您将鼠标从元素移到旁边时它不关闭的问题。
它的工作原理是在MUI背景上禁用
pointerEvents
,这样你就可以继续检测它后面的鼠标悬停(并在菜单容器中重新启用它)。这意味着我们也可以向按钮添加一个leave
事件侦听器。然后,它会跟踪你是否使用
currentlyHovering
将鼠标悬停在按钮或菜单上。当您将鼠标悬停在按钮上时,它会显示菜单,然后当您离开时,它会启动
50ms
超时以关闭它,但如果我们在此期间再次悬停在按钮或菜单上,它会重置currentlyHovering
并保持打开状态。我还添加了以下代码行,以便菜单在按钮下方打开:
c3frrgcw3#
对菜单项使用交互式HTML工具提示效果很好,不需要单击以查看菜单项。
以下是材质UI v.4的示例。
用法:
ttisahbt4#
我放弃了使用菜单组件,因为它实现了Popover。为了解决覆盖问题,我不得不写太多的代码。所以我尝试使用旧的CSS方式:
CSS:相对父元素+绝对菜单元素
组件:纸张+菜单列表
样式化构件:
gorkyyrv5#