Issue
I'm new to Material UI and just started fiddling around with their App bar with Menu example. When toggling the menu dropdown, it opens up over the Appbar itself, whereas I'd like it to open below the Navbar.
From the docs, I understand that changing the position can be done with anchorEl
as explained in the Popover positioning guide. But when I implement this to my menu
component nothing happens. What is "the right Material UI way" to take care of this?
class Header extends React.Component {
state = {
auth: true,
anchorEl: null,
anchorOriginVertical: 'bottom',
anchorOriginHorizontal: 'right',
transformOriginVertical: 'top',
transformOriginHorizontal: 'right',
anchorReference: 'anchorEl',
};
handleChange = (event, checked) => {
this.setState({ auth: checked });
};
handleMenu = event => {
this.setState({ anchorEl: event.currentTarget });
};
handleClose = () => {
this.setState({ anchorEl: null });
};
render() {
const { classes } = this.props;
const { auth, anchorEl } = this.state;
const open = Boolean(anchorEl);
return (
<div className={classes.root}>
<AppBar position="static">
<Toolbar>
<Typography type="title" color="inherit" className={classes.flex}>
Title
</Typography>
{auth && (
<div>
<IconButton
aria-owns={open ? 'menu-appbar' : null}
aria-haspopup="true"
onClick={this.handleMenu}
color="contrast"
>
<AccountCircle />
</IconButton>
<Menu
id="menu-appbar"
anchorEl={anchorEl}
open={open}
onClose={this.handleClose}
>
<MenuItem onClick={this.handleClose}>Profile</MenuItem>
<MenuItem onClick={this.handleClose}>My account</MenuItem>
</Menu>
</div>
)}
</Toolbar>
</AppBar>
</div>
);
}
}
Solution
The way I got it to work is by setting the props on the menu itself like this:
<Menu
id="menu-appbar"
anchorEl={anchorEl}
getContentAnchorEl={null}
anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}
transformOrigin={{ vertical: 'top', horizontal: 'center' }}
open={open}
onClose={this.handleClose}
className={props.classes.menu}
>
The positioning props (anchorOrigin
, transformOrigin
) come from the Popover component, see the demo: https://mui.com/material-ui/react-popover/#anchor-playground.
I also had to put in getContentAnchorEl={null}
to get the vertical props to work, which I eventually learned from this issue https://github.com/mui/material-ui/issues/7961.
Edit: The getContentAnchorEl
prop was removed in Material UI v5, it's no longer needed.
Not sure how to do this when using the state to set the properties of the anchor element, but maybe this will get you started.
Answered By - Emmy
Answer Checked By - - Terry (ReactFix Volunteer)