You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Material UI Menu打开后无法关闭及IconButton点击失效问题求助

问题根因

当前异常是因为将<Menu>组件嵌套在了<IconButton>组件内部导致的事件冒泡冲突:当你触发Menu的关闭逻辑重置anchorEl时,点击事件会向上冒泡到父级IconButton,触发handleClick重新给anchorEl赋值,最终表现为菜单完全无法关闭。
你之前把Menu移到IconButton外部后点击无响应,是调整结构时没有保留正确的属性绑定关系,只需按照下面的方式调整结构即可。

修复后的完整代码

import { Link } from 'react-router-dom';
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import IconButton from '@material-ui/core/IconButton';
import MenuIcon from '@material-ui/icons/Menu';
import Menu from '@material-ui/core/Menu';
import MenuItem from '@material-ui/core/MenuItem';

const useStyles = makeStyles((theme) => ({
  root: {
    flexGrow: 1,
  },
  menuButton: {
    marginRight: theme.spacing(2),
  },
  title: {
    flexGrow: 1,
  },
}));

export default function ButtonAppBar() {
  const classes = useStyles();
  const [anchorEl, setAnchorEl] = React.useState(null);

  const handleClick = (event) => {
    setAnchorEl(event.currentTarget);
  };
  const handleClose = () => {
    setAnchorEl(null);
  };

  return (
    <div className={classes.root}>
      <AppBar position="static">
        <Toolbar>
          <Typography variant="h6" className={classes.title}>
            HPH
          </Typography>
          <IconButton 
            edge="start"  
            onClick={handleClick} 
            className={classes.menuButton} 
            color="inherit" 
            aria-label="menu"
          >
            <MenuIcon />
          </IconButton>
          <Menu
            id="simple-menu"
            anchorEl={anchorEl}
            keepMounted
            open={Boolean(anchorEl)}
            onClose={handleClose}
          >
            <MenuItem button component={Link} to="/" onClick={handleClose}>
              Home
            </MenuItem>
            <MenuItem button component={Link} to="/search" onClick={handleClose}>
              Search Pricing
            </MenuItem>
            <MenuItem button component={Link} to="/about" onClick={handleClose}>
              About
            </MenuItem>
          </Menu>
        </Toolbar>
      </AppBar>
    </div>
  );
}

优化说明

  • 仅将Menu组件移出IconButton改为平级放置,即可解决事件冒泡导致的无法关闭问题,原有状态、属性绑定逻辑完全不需要修改
  • 给每个MenuItem新增了onClick={handleClose}绑定,点击菜单项跳转后会自动关闭菜单,符合常规交互逻辑

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 01:54:04