【问题标题】:how navigate using the MenuItem? material-ui V1如何使用 MenuItem 进行导航?材料-ui V1
【发布时间】:2018-06-01 02:19:54
【问题描述】:

为什么不清楚MenuItem 如何导航到其他路线?

例如,当点击一个菜单项时,我想路由到'/account'

我可以使用 onclick 功能来实现这一点,但我确信有更简单的方法。请告诉我,我想在我的项目中实现它。

顺便说一句,使用 containerElement containerElement={<Link to="/dashboard" />} 时出现以下错误:

index.js:2177 Warning: React does not recognize the `containerElement` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `containerelement` instead. If you accidentally passed it from a parent component, remove it from the DOM element.
    in li (created by ButtonBase)
    in ButtonBase (created by withStyles(ButtonBase))
    in withStyles(ButtonBase) (created by ListItem)
    in ListItem (created by withStyles(ListItem))
    in withStyles(ListItem) (created by MenuItem)
    in MenuItem (created by withStyles(MenuItem))
    in withStyles(MenuItem) (at MenuAppBar.js:116)
    in ul (created by List)
    in List (created by withStyles(List))
    in withStyles(List) (created by MenuList)
    in MenuList (created by Menu)
    in div (created by Paper)
    in Paper (created by withStyles(Paper))
    in withStyles(Paper) (created by Popover)
    in Transition (created by CSSTransition)
    in CSSTransition (created by Grow)
    in Grow (created by withTheme(Grow))
    in withTheme(Grow) (created by Popover)
    in div (created by Modal)
    in Portal (created by Modal)
    in Modal (created by withStyles(Modal))
    in withStyles(Modal) (created by Popover)
    in Popover (created by withStyles(Popover))
    in withStyles(Popover) (created by Menu)
    in Menu (created by withStyles(Menu))
    in withStyles(Menu) (at MenuAppBar.js:101)
    in div (at MenuAppBar.js:92)
    in div (created by Toolbar)
    in Toolbar (created by withStyles(Toolbar))
    in withStyles(Toolbar) (at MenuAppBar.js:77)
    in header (created by Paper)
    in Paper (created by withStyles(Paper))
    in withStyles(Paper) (created by AppBar)
    in AppBar (created by withStyles(AppBar))
    in withStyles(AppBar) (at MenuAppBar.js:76)
    in div (at MenuAppBar.js:62)
    in MenuAppBar (created by Connect(MenuAppBar))
    in Connect(MenuAppBar) (created by withStyles(Connect(MenuAppBar)))
    in withStyles(Connect(MenuAppBar)) (at Test.js:9)
    in div (at Test.js:7)
    in Test (created by Route)
    in Route (at App.js:37)
    in Switch (at App.js:34)
    in div (at App.js:32)
    in Router (created by BrowserRouter)
    in BrowserRouter (at App.js:31)
    in div (at App.js:30)
    in App (created by Connect(App))
    in Connect(App) (at index.js:34)
    in MuiThemeProvider (created by MuiThemeProviderWrapper)
    in MuiThemeProviderWrapper (at index.js:33)
    in Provider (at index.js:32)

当我通过containerElement -> containerelement 修复该错误时,错误消失了,这是个好消息,但坏消息是菜单不适合链接中提到的死记硬背!

MenuAppBar.js

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { withStyles } from 'material-ui/styles';
import AppBar from 'material-ui/AppBar';
import Toolbar from 'material-ui/Toolbar';
import Typography from 'material-ui/Typography';
import IconButton from 'material-ui/IconButton';
import MenuIcon from 'material-ui-icons/Menu';
import AccountCircle from 'material-ui-icons/AccountCircle';
import Switch from 'material-ui/Switch';
import { FormControlLabel, FormGroup } from 'material-ui/Form';
import Menu, { MenuItem } from 'material-ui/Menu';

import Button from 'material-ui/Button';

import { connect } from 'react-redux';
import {Link } from 'react-router-dom'


const styles = {
  root: {
    width: '100%',
  },
  flex: {
    flex: 1,
  },
  menuButton: {
    marginLeft: -12,
    marginRight: 20,
  },
};

class MenuAppBar extends Component {

  state = {
    auth: true,
    anchorEl: null,
  };

  handleChange = (event, checked) => {
    this.setState({ auth: checked });
  };

  handleMenu = event => {
    this.setState({ anchorEl: event.currentTarget });
  };

  handleClose = () => {
    this.setState({ anchorEl: null });
  };

  render() {
    // console.log(this.props.auth)
    // if(!this.props.auth)
      // return <div> Loading... </div>;

    const { classes } = this.props;
    const { auth, anchorEl } = this.state;
    const open = Boolean(anchorEl);

    return (
      <div className={classes.root}>



        {/* the log switch */}
       {/* <FormGroup>        
                 <FormControlLabel
                   control={
                     <Switch checked={auth} onChange={this.handleChange} aria-label="LoginSwitch" />
                   }
                   label={auth ? 'Logout' : 'Login'}
                 />
               </FormGroup>*/}

        <AppBar position="static">
          <Toolbar>

            {/*
            <IconButton className={classes.menuButton} color="contrast" aria-label="Menu">
              <MenuIcon />
            </IconButton> */}

            <Typography type="title" color="inherit" className={classes.flex}>
              المواعيد
            </Typography>



            {/*If logged in */}
            {this.props.auth && (
              <div>
                <IconButton
                  aria-owns="menu-appbar-logged"
                  aria-haspopup="true"
                  onClick={this.handleMenu}
                  color="contrast"
                >
                  <AccountCircle />
                </IconButton>
                <Menu
                  id="menu-appbar-logged"
                  anchorEl={anchorEl}
                  anchorOrigin={{
                    vertical: 'top',
                    horizontal: 'right',
                  }}
                  transformOrigin={{
                    vertical: 'top',
                    horizontal: 'right',
                  }}
                  open={open}
                  onClose={this.handleClose}
                >
                  {/*Changing font for this text is on the them and there search for subheading*/}
                  <MenuItem onClick={this.handleClose}  containerelement={<Link to="/dashboard" />}>الملف الشخصي</MenuItem>
                  <MenuItem onClick={this.handleClose} href="/api/logout">تسجيل الخروج</MenuItem>
                </Menu>
              </div>
            )}
            {/*end*/}




            {/*If logged out */}
            {!this.props.auth && (
              <div>
               <Button color="contrast" href="/auth/google/">تسجيل الدخول</Button>
              </div>
            )}
            {/*end*/}


          </Toolbar>
        </AppBar>


      </div>
    );
  }
}

MenuAppBar.propTypes = {
  classes: PropTypes.object.isRequired,
};

function mapStateToProps({auth}){
  return {auth}
}

export default withStyles(styles)(connect(mapStateToProps)(MenuAppBar));

更新

我发现@Gavin Thomas 先生在下面提出的解决方案引起的另一个问题是关于 SO 的帖子。问题是 using 只是将提到的“to”属性值放在链接到现有路由的 URL 中,而不转到该路径,即

<MenuItem onTouchTap={() => {this.handleClose()}}><NavLink to="/api/logout">Sign Out</NavLink></MenuItem>

最终将浏览器上的链接设为http://localhost:3000/logout,而无需在 nodejs 后端服务器的注销路由上去那里!这是一个问题。

请注意,我使用代理从 3000 定向到 5000 如下

 "proxy": {
    "/api/*": {
      "target": "http://localhost:5000"
    }
  },

一般来说,我猜那是因为和之间的区别!

所以请帮我解决第二个问题!

【问题讨论】:

  • 发布你的整个代码页面,我们需要查看所有内容...
  • 更新了帖子。
  • 尝试像这样导入 menuItem.... ===> import MenuItem from 'material-ui/MenuItem';并单独导入Menu,然后改回containerElement
  • 那样做,找不到模块:无法解析“material-ui/MenuItem”。请注意帖子标题,我说的是material-ui V1。
  • 感谢您的决心! 是解决方案。因此,请使用该 SO 帖子更新您的第一个回复,我将投票并使其成为答案。

标签: reactjs material-design material-ui


【解决方案1】:

您应该使用component 属性。可以使用 react-router-dom 中的Link 组件:

<MenuItem component={Link} to="/logout">
  Logout
</MenuItem>

containerElement 属性在 v0.x 中使用,从 v1 开始不再存在。

请参考MenuItem的文档

【讨论】:

  • 感谢您的回复,我完成了您的解决方案,但仍然将“to”属性值绑定到现有 URL!正如我在这个答案的更新中所描述的那样,并且还为此打开了一个新帖子。 stackoverflow.com/questions/47875453/…
  • 这与原始问题无关,即如何配置 MenuItem 以使其导航到路线。最简单的方法是按照我在回答中概述的方式。
  • 你如何使用 TypeScript 处理这个问题?当你使用component={Link},然后添加to="",你会得到[ts] Property 'to' does not exist on type 'IntrinsicAttributes &amp; MenuItemProps &amp; { children?: ReactNode; }'.
  • 刚刚回答了我自己的问题,这很有效:&lt;MenuItem component={Link} {...{ to: route.path}}&gt;...
【解决方案2】:

这是我们发现的...

你现在需要使用 vs Link

React material-ui MenuItem containerElement not working

import React, { Component } from 'react';
import { NavLink } from 'react-router-dom'
import Menu from 'material-ui/Menu';
import MenuItem from 'material-ui/MenuItem';
import Drawer from 'material-ui/Drawer'

    <Drawer
         docked={false}
         open={this.state.open}
         onRequestChange={(open) => this.setState({open})}>
         <MenuItem onTouchTap={() => {this.handleClose()}} >
              <NavLink to="/">Home </NavLink>
         </MenuItem>
         <MenuItem onTouchTap={() => {this.handleClose() }} >
              <NavLink to="/about"> About Us </NavLink>
         </MenuItem>
    </Drawer>

【讨论】:

  • 我使用了 containerElement 但出现了错误。让我再试一次并将错误粘贴到帖子中。
  • 您确定您还设置了浏览器路由器吗?
  • |更新帖子,期待您的回音
  • 更新了帖子,因为该帖子在 SO 上的解决方案引起的问题。请检查一下。
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2019-08-22
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多