我是一个新的材料用户界面,刚刚开始摆弄他们的应用程序栏与菜单的例子。当切换菜单下拉,它打开了应用程序栏本身,而我希望它打开导航栏下方。
从文档中,我了解到可以使用anchorEl
更改位置,如Popover定位指南中所述。但是当我在menu
组件中实现此操作时,什么也没发生。什么是“正确的Material UI方式”来处理此问题?
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>
);
}
}
8条答案
按热度按时间jvidinwx1#
我让它工作的方法是通过设置菜单本身的 prop ,像这样:
定位 prop (
anchorOrigin
,transformOrigin
)来自Popover组件,请参见演示:https://mui.com/material-ui/react-popover/#anchor-playground。我还必须放入
getContentAnchorEl={null}
才能让垂直 prop 工作,这是我最终从本期https://github.com/mui/material-ui/issues/7961中学到的。编辑:
getContentAnchorEl
prop 在Material UI v5中被移除,不再需要。当使用状态设置锚元素的属性时,不确定如何做到这一点,但也许这会让您开始。
hgqdbh6s2#
这就是我的解决方案,希望这能对某人有所帮助。
nwsw7zdq3#
Matheus答案中存在错误,anchorEl的类型不是布尔值,在ReactHooks中,它需要是:
xesrikrc4#
对我来说,我有问题的跳跃效果,点击后的第一次..我不得不使
keepMounted={false}
您可以通过从devTool中调整
translateX(10px) translateY(50px)
来获得x和y值。9cbw7uwe5#
这是因为您尚未定义锚。
Menu属性-anchorEl负责传递调用它的按钮的位置,这样说并不正确,只是为了易于理解。
这样,每当有点击的时候你都应该参考,我建议你使用React钩子,这会让组件变得干净。
React状态
React挂钩
渲染
hiz5n14c6#
实现这一点的一种简单方法是使用useRef挂钩
1.创建引用
1.插入您的引用,如果您想显示菜单,在您的情况下,一个Div或其他
1.在菜单的锚点属性中插入引用
在此输入代码
对我来说这是最简单的方法
jdg4fx2g7#
在New Material-ui版本5中,我不明白为什么会发生这种奇怪的事情。但是当我在应用程序栏中创建一个单独的菜单组件时,它就工作了。
pdsfdshx8#
所有这些东西对我来说都不起作用。所以我给了这个按钮一个id,并使用javascript将其放在菜单上: