如何使用Material-UI在Appbar下面打开下拉菜单?

时间:2018-01-08 20:50:03

标签: reactjs material-ui

我是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>
    );
  }
}

7 个答案:

答案 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 值。

enter image description here

                      <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 钩子

  1. 创建参考
  2. 如果您想在 Div 或其他情况下显示菜单,请插入您的参考
  3. 在菜单的anchor prop中插入ref

在此处输入代码

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>