Material UI 使用路线的菜单
Material UI Menu using routes
我在玩material-ui。我使用路线实现了 LeftNav,但我找不到获取 IconMenu 或使用链接或路线的菜单的方法。任何人都可以指出一个好的来源/教程吗?该文档不足,并且两个组件似乎都不支持 'menuItems' 和 属性 一样,而 LeftNav 确实如此。
您可以在 MenuItem
上设置 linkButtton
属性以生成 link,然后再添加一个 href
。
<MenuItem linkButton={true} href="link/to/some/page" primaryText="Sample Link" />
另一个迟来的更新:
不再支持 containerElement
道具,请改用 component
道具。
查看文档 here。
2016 年 12 月编辑: linkButton
道具已 弃用 ,你将收到警告:
Warning: Unknown props `linkButton` on <a> tag.
所以只需删除道具:
<MenuItem
containerElement={<Link to="/profile" />}
primaryText="Profile"
leftIcon={
<FontIcon className="material-icons">people</FontIcon>
}
/>
Here's an Example Repo, and the Live Demo Here.
原回答:
只是想指出,如果您使用 react-router,您可能希望使用 <Link to="/some/page" />
而不是 <a>
标签。
为此,您需要使用 containerElement
属性
<MenuItem
linkButton
containerElement={<Link to="/profile" />}
primaryText="Profile"
leftIcon={
<FontIcon className="material-icons">people</FontIcon>
}
/>
(如果您只传递 true
,则可以省略 ={true}
,
换句话说,<MenuItem linkButton />
与 <MenuItem linkButton={true} />
)
相同
containerElement
和 linkButton
道具实际上已记录 in the buttons section,但您也可以在 MenuItem
中使用它。
这是我的实现,和material-ui官方网站上的一模一样。您可以使用的组件包括 AppBar
、Drawer
和 ListItem
。 SelectableList
可以实现为 let SelectableList = MakeSelectable(List)
.
<div>
<AppBar
onLeftIconButtonTouchTap={this.handleLeftIconButtonTouchTap}
title={title}
showMenuIconButton={true}
zDepth={0}
/>
<Drawer
open={this.state.open}
docked={true}
onRequestChange={(open, reason) => {
this.setState({open:false})
}}
>
<AppBar title={title} />
<SelectableList
value={location.pathname}
onChange={this.handleRequestChangeList}
>
<Subheader>Selectable Contacts</Subheader>
<ListItem
value={"link1"}
primaryText="Link1"
/>
<ListItem
value={"link2"}
primaryText="Link2"
/>
</SelectableList>
</Drawer>
</div>
EnhancedButton
的道具 linkButton
已弃用。提供 href
属性 时不再需要 LinkButton。
它将在 v0.16.0 中被删除。
<MenuItem onTouchTap={this.handleClose} href="/link/data">Link Item</MenuItem>
工作正常
我无法使用 react-router
在 iOS 的 Safari 上运行 containerElement
。我使用的是 0.17.2
of Material UI 和 react-router@v3
,这里有一个对我有用的解决方法:
<MenuItem
onTouchTap={() => {
this._yourMethod()
browserHistory.push('/howItWorks')
}}
primaryText="Menu Link"
/>
onTouchTap 对我不起作用我必须使用 onClick 看下面的例子
<MenuItem
onClick={this.logout}
containerElement={<Link to="/" />}
primaryText="Sign out"
rightIcon={
<b style={style.rightIcon}>
<img
className="menu-img"
src="img/app/logout.png"
alt="logout"
/>
</b>
}
/>
希望这对其他人也有帮助
从 Material-UI 1.0 开始,新语法是:
<MenuItem
component={Link}
// the 'to' prop (and any other props not recognized by MenuItem itself)
// will be passed down to the Link component
to="/profile"
>
Profile
</MenuItem>
(注意:此示例不包含图标。为此有一个新的 ListItemIcon
组件。)
None 的现有答案(2018 年 9 月)对我适用于 react 16.4.2 和 react-router 4.2.2,所以这是我的解决方案:
<Link to='/notifications' style={{ textDecoration: 'none' }}>
<MenuItem>Notifications</MenuItem>
</Link>
如您所见,MenuItem 组件被 Link 组件包围,我添加了一个样式 textDecoration: 'none'
不给项目添加下划线。
自己做了一些搜索后,我采用了一个稍微不同的解决方案:
<MenuItem onClick={() => {handleClose("/#about")}}>About me</MenuItem>
附带JS功能:
function handleClose(nav) {
window.location.href = nav;
}
希望证明可以作为替代品使用。
可以使用react-route-dom和MenuItem onClick属性先import react-router-dom:
import { useHistory } from 'react-router-dom'
然后在组件中声明一个函数来处理您的 onClick:
const navigate = () => history.push('route/to/navigate')
然后使用您的 MenuItem
<MenuItem onClick={navigate}>Navigate</MenuItem>
截至 2020 年 9 月,唯一有效且超级简单的方法是
<MenuItem component="a" href="/your-path">Click Me</MenuItem>
奖励:添加带有徽章的图标:
<MenuItem component="a" href="/your-path">
<IconButton color="inherit" href="/your-path">
<Badge badgeContent="12" color="secondary">
<StarsSharpIcon color="action"/>
</Badge>
</IconButton>
Click Me
</MenuItem>
使用 M-UI 4.x 你可以在 MenuItem
上设置一个 component
prop 和
<MenuItem component='a' href='link/to/some/page'>Sample Link</MenuItem>
import Menu from '@material-ui/core/Menu';
import MenuItem from '@material-ui/core/MenuItem';
import { Link } from 'react-router-dom';
<MenuItem component={Link} to='/login'>
Login
</MenuItem>
这对我有用,2021 年 9 月,通过使用 React Router 和 MenuItem 的 Link 道具。
从 v5.2.2 开始,您可以使用:
import { MenuItem } from '@mui/material';
import { Link } from 'react-router-dom';
<MenuItem component={Link} to="/profile">
Profile
</MenuItem>
这对我适用于 v5
用于外部链接
<MenuItem
component={"a"}
href={"https://example.com"}
>Go here</MenuItem>
或内部链接
import { MenuItem } from "@mui/material";
import { Link } from "react-router-dom";
<MenuItem
component={Link}
to={"/users/2323"}
>Go here</MenuItem>
我们应该在 <MenuItem>
标签之外使用 <Link>
标签
错误:
<MenuItem>
<ListItemText>
<Link to='/ticket-blotter' style={{ textDecoration: 'none' }}>
TICKET BLOTTER
</Link>
</ListItemText>
</MenuItem>
解法:
<Link to='/ticket-blotter' style={{ textDecoration: 'none' }}>
<MenuItem>
<ListItemText>
TICKET BLOTTER
</ListItemText>
</MenuItem>
</Link>
你也可以这样试试
import { useHistory } from 'react-router-dom';
const YourComponentName = () =>{
const history = useHistory();
const handleRoutes = (path) =>{
history.push(path)
}
return(
<>
...
<MenuItem onClick={()=>handleRoutes('/dashboard')}>Dashboard</MenuItem>
<MenuItem onClick={()=>handleRoutes('/profile')}>Profile</MenuItem>
...
</>
)
}
我在玩material-ui。我使用路线实现了 LeftNav,但我找不到获取 IconMenu 或使用链接或路线的菜单的方法。任何人都可以指出一个好的来源/教程吗?该文档不足,并且两个组件似乎都不支持 'menuItems' 和 属性 一样,而 LeftNav 确实如此。
您可以在 MenuItem
上设置 linkButtton
属性以生成 link,然后再添加一个 href
。
<MenuItem linkButton={true} href="link/to/some/page" primaryText="Sample Link" />
另一个迟来的更新:
不再支持containerElement
道具,请改用 component
道具。
查看文档 here。
2016 年 12 月编辑: linkButton
道具已 弃用 ,你将收到警告:
Warning: Unknown props `linkButton` on <a> tag.
所以只需删除道具:
<MenuItem
containerElement={<Link to="/profile" />}
primaryText="Profile"
leftIcon={
<FontIcon className="material-icons">people</FontIcon>
}
/>
Here's an Example Repo, and the Live Demo Here.
原回答:
只是想指出,如果您使用 react-router,您可能希望使用 <Link to="/some/page" />
而不是 <a>
标签。
为此,您需要使用 containerElement
属性
<MenuItem
linkButton
containerElement={<Link to="/profile" />}
primaryText="Profile"
leftIcon={
<FontIcon className="material-icons">people</FontIcon>
}
/>
(如果您只传递 true
,则可以省略 ={true}
,
换句话说,<MenuItem linkButton />
与 <MenuItem linkButton={true} />
)
containerElement
和 linkButton
道具实际上已记录 in the buttons section,但您也可以在 MenuItem
中使用它。
这是我的实现,和material-ui官方网站上的一模一样。您可以使用的组件包括 AppBar
、Drawer
和 ListItem
。 SelectableList
可以实现为 let SelectableList = MakeSelectable(List)
.
<div>
<AppBar
onLeftIconButtonTouchTap={this.handleLeftIconButtonTouchTap}
title={title}
showMenuIconButton={true}
zDepth={0}
/>
<Drawer
open={this.state.open}
docked={true}
onRequestChange={(open, reason) => {
this.setState({open:false})
}}
>
<AppBar title={title} />
<SelectableList
value={location.pathname}
onChange={this.handleRequestChangeList}
>
<Subheader>Selectable Contacts</Subheader>
<ListItem
value={"link1"}
primaryText="Link1"
/>
<ListItem
value={"link2"}
primaryText="Link2"
/>
</SelectableList>
</Drawer>
</div>
EnhancedButton
的道具 linkButton
已弃用。提供 href
属性 时不再需要 LinkButton。
它将在 v0.16.0 中被删除。
<MenuItem onTouchTap={this.handleClose} href="/link/data">Link Item</MenuItem>
工作正常
我无法使用 react-router
在 iOS 的 Safari 上运行 containerElement
。我使用的是 0.17.2
of Material UI 和 react-router@v3
,这里有一个对我有用的解决方法:
<MenuItem
onTouchTap={() => {
this._yourMethod()
browserHistory.push('/howItWorks')
}}
primaryText="Menu Link"
/>
onTouchTap 对我不起作用我必须使用 onClick 看下面的例子
<MenuItem
onClick={this.logout}
containerElement={<Link to="/" />}
primaryText="Sign out"
rightIcon={
<b style={style.rightIcon}>
<img
className="menu-img"
src="img/app/logout.png"
alt="logout"
/>
</b>
}
/>
希望这对其他人也有帮助
从 Material-UI 1.0 开始,新语法是:
<MenuItem
component={Link}
// the 'to' prop (and any other props not recognized by MenuItem itself)
// will be passed down to the Link component
to="/profile"
>
Profile
</MenuItem>
(注意:此示例不包含图标。为此有一个新的 ListItemIcon
组件。)
None 的现有答案(2018 年 9 月)对我适用于 react 16.4.2 和 react-router 4.2.2,所以这是我的解决方案:
<Link to='/notifications' style={{ textDecoration: 'none' }}>
<MenuItem>Notifications</MenuItem>
</Link>
如您所见,MenuItem 组件被 Link 组件包围,我添加了一个样式 textDecoration: 'none'
不给项目添加下划线。
自己做了一些搜索后,我采用了一个稍微不同的解决方案:
<MenuItem onClick={() => {handleClose("/#about")}}>About me</MenuItem>
附带JS功能:
function handleClose(nav) {
window.location.href = nav;
}
希望证明可以作为替代品使用。
可以使用react-route-dom和MenuItem onClick属性先import react-router-dom:
import { useHistory } from 'react-router-dom'
然后在组件中声明一个函数来处理您的 onClick:
const navigate = () => history.push('route/to/navigate')
然后使用您的 MenuItem
<MenuItem onClick={navigate}>Navigate</MenuItem>
截至 2020 年 9 月,唯一有效且超级简单的方法是
<MenuItem component="a" href="/your-path">Click Me</MenuItem>
奖励:添加带有徽章的图标:
<MenuItem component="a" href="/your-path">
<IconButton color="inherit" href="/your-path">
<Badge badgeContent="12" color="secondary">
<StarsSharpIcon color="action"/>
</Badge>
</IconButton>
Click Me
</MenuItem>
使用 M-UI 4.x 你可以在 MenuItem
上设置一个 component
prop 和
<MenuItem component='a' href='link/to/some/page'>Sample Link</MenuItem>
import Menu from '@material-ui/core/Menu';
import MenuItem from '@material-ui/core/MenuItem';
import { Link } from 'react-router-dom';
<MenuItem component={Link} to='/login'>
Login
</MenuItem>
这对我有用,2021 年 9 月,通过使用 React Router 和 MenuItem 的 Link 道具。
从 v5.2.2 开始,您可以使用:
import { MenuItem } from '@mui/material';
import { Link } from 'react-router-dom';
<MenuItem component={Link} to="/profile">
Profile
</MenuItem>
这对我适用于 v5
用于外部链接
<MenuItem
component={"a"}
href={"https://example.com"}
>Go here</MenuItem>
或内部链接
import { MenuItem } from "@mui/material";
import { Link } from "react-router-dom";
<MenuItem
component={Link}
to={"/users/2323"}
>Go here</MenuItem>
我们应该在 <MenuItem>
标签之外使用 <Link>
标签
错误:
<MenuItem>
<ListItemText>
<Link to='/ticket-blotter' style={{ textDecoration: 'none' }}>
TICKET BLOTTER
</Link>
</ListItemText>
</MenuItem>
解法:
<Link to='/ticket-blotter' style={{ textDecoration: 'none' }}>
<MenuItem>
<ListItemText>
TICKET BLOTTER
</ListItemText>
</MenuItem>
</Link>
你也可以这样试试
import { useHistory } from 'react-router-dom';
const YourComponentName = () =>{
const history = useHistory();
const handleRoutes = (path) =>{
history.push(path)
}
return(
<>
...
<MenuItem onClick={()=>handleRoutes('/dashboard')}>Dashboard</MenuItem>
<MenuItem onClick={()=>handleRoutes('/profile')}>Profile</MenuItem>
...
</>
)
}