我是Material-UI的新手,刚刚开始摆弄他们的App bar with Menu example。当切换菜单下拉菜单时,它会打开Appbar本身,而我希望它在Navbar下方打开。
从文档中,我了解这可以使用Anchor EL
解释here。但是当我将这个实现到我的menu
组件时,没有任何反应。什么是“正确的材料 - 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>
);
}
}
答案 0 :(得分:14)
不确定是否仍然需要答案。 (该链接不再正常工作)。
无论如何,我也遇到类似的问题,而要使其正常工作,是通过在菜单本身上设置属性,如下所示:
<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}
>
我必须放入getContentAnchorEl={null}
才能使垂直属性起作用,我最终从本期https://github.com/mui-org/material-ui/issues/7961中学到了这一点。
使用状态设置锚元素的属性时,不确定如何执行此操作,但这也许会让您入门。
答案 1 :(得分:3)
对我来说,第一次点击后,我有跳跃效果的问题..我必须制作keepMounted={false}
您可以通过从 devTool 调整 translateX(10px) translateY(50px)
来获得 x 和 y 值。
<div>
<Menu
id="simple-menu"
anchorEl={anchorEl}
keepMounted={false}
open={Boolean(anchorEl)}
onClose={this.handleClose}
PaperProps={{
style: {
transform: 'translateX(10px) translateY(50px)',
}
}}
>
<MenuItem onClick={this.handleClose}>My Account</MenuItem>
<Divider variant="middle"/>
<MenuItem onClick={this.handleClose}>Logout</MenuItem>
</Menu>
</div>
答案 2 :(得分:1)
一种简单的方法是使用 useRef 钩子
在此处输入代码
const inputEl = useRef(null);
<Mycomponent ref={inputEl}/>
<Menu
id="simple-menu"
anchorEl={inputEl.current}
keepMounted
open={Boolean(anchorEl)}
onClose={handleClose}
>
对我来说这是迄今为止最简单的方法
答案 3 :(得分:0)
这是因为您尚未定义锚点。
Menu属性- anchorEl ,负责传递调用它的按钮的位置,这并不是说真的,而是为了易于理解。
这样,只要有点击,您就应该参考。我建议您使用反应钩,以使组件清洁。
有状态反应
const [menuOpen, setMenuOpen] = useState(false)
const [anchorEl, setAnchorEl] = useState(false)
const handleClick = (event) => {
const anchorEl = event.currentTarget
this.setState({ ...this.state, menuOpen: !menuOpen , anchorEl })
反应钩
const [menuOpen, setMenuOpen] = useState(false)
const [anchorEl, setAnchorEl] = useState(false)
const handleClick = (event) => {
setAnchorEl(event.currentTarget)
}
渲染
return (
<Menu
anchorEl={anchorEl}
open={menuOpen}
onClose={handleClick }
</Menu
)
答案 4 :(得分:0)
Matheus答案中有一个错误,anchorEl的类型不是布尔值,在ReactHooks中它应该是:
const [menuOpen, setMenuOpen] = useState<boolean>(false);
const [anchorEl, setAnchorEl] = useState()
const recordButtonPosition = (event: any) => {
setAnchorEl(event.currentTarget);
setMenuOpen(true);
}
let closeMenu = () => {
setMenuOpen(false);
}
return (
<React.Fragment>
<Button onClick={recordButtonPosition}>
OPEN MENU
</Button>
<Menu
anchorEl={anchorEl}
open={menuOpen}
onClose={closeMenu}>
<MenuItem onClick={closeMenu}> ExampleMenuItem </MenuItem>
</Menu>
</React.Fragment>
);
答案 5 :(得分:0)
这是我的解决方案,希望对您有所帮助。
<Menu
open={this.state.openProps}
anchorEl={this.state.anchorEl}
onClose={onClose}
className={classes.styles}
disableAutoFocusItem
PaperProps={{
style: {
left: '50%',
transform: 'translateX(-77%) translateY(32%)',
}
}}
MenuListProps={{
style: {
padding: 0,
},
}}
>
答案 6 :(得分:-1)
所有这些都对我不起作用。所以我给按钮一个 id 并使用 javascript 把它放在菜单上:
<IconButton id="btnPerfil" onClick={this.toggleMenuPerfilOpen}>
<AccountCircle color="inherit" />
</IconButton>
<Menu
anchorPosition={{
vertical: 'top',
horizontal: 'center'
}}
anchorEl={document.getElementById('btnPerfil')}
keepMounted
open={this.state.isMenuPerfilOpen}
onClose={this.toggleMenuPerfilOpen}
>...</Menu>