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
相关产品推荐
相关产品推荐

