Material-UI 的 Menu 菜单点击后不关闭怎么办?
我用 Material-UI 写了个下拉菜单,点击菜单项之后菜单不会自动关闭,得点外面才行,这体验太差了。
我试过在 MenuItem 的 onClick 里手动调用 setAnchorEl(null),但有时候还是关不掉,特别是用了 React.memo 包裹组件之后。是不是哪里漏了?
const handleClick = (event) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
return (
<>
<Button onClick={handleClick}>打开菜单</Button>
<Menu anchorEl={anchorEl} open={Boolean(anchorEl)} onClose={handleClose}>
<MenuItem onClick={handleClose}>选项1</MenuItem>
<MenuItem onClick={handleClose}>选项2</MenuItem>
</Menu>
</>
);
Material-UI 的 Menu 组件其实自带关闭逻辑,你不需要在每个 MenuItem 上写 onClick 关它。Menu 内部会捕获 MenuItem 的点击事件然后触发 onClose。
改成这样就行:
然后你的业务逻辑放在 handleMenuItemClick 里执行,执行完了再调 handleClose:
如果你用了 React.memo 之后出问题,大概率是闭包捕获了旧状态。解决办法是确保 handleClose 是用 useCallback 包的,并且依赖项写对:
或者更干脆——别在 MenuItem 上绑 onClick,就让 Menu 自己处理关闭,你需要做的只是监听菜单关闭后的事件。
试试这个优化方案:
这样改有几个好处:
1. 把关闭逻辑和业务逻辑解耦了
2. 确保每次点击都会先关闭菜单
3. 不会因为React.memo之类的优化导致关闭失效
如果MenuItem有独立的点击处理逻辑,就把逻辑函数传给handleItemClick。我用这招解决了不少莫名其妙的菜单关闭问题,MUI的组件有时候确实需要点workaround。