是否可以在 react-router 中使用 material-ui 按钮导航?

IT技术 reactjs react-router material-ui react-router-dom
2021-05-23 06:54:37

我有一个使用 Material-UI 设计的 Web 应用程序,如下所示,我正在使用按钮导航来浏览我的基本登录页面组件。

<div className="footer">
  <BottomNavigation value={value} onChange={this.handleChange} className={classes.root}>
    <BottomNavigationAction label="signal" value="signal" icon={<ShowChart />} className={classes.content}/>
    <BottomNavigationAction label="hotlist" value="hotlist" icon={<HotList />} className={classes.content}/>
    <BottomNavigationAction label="analyze" value="analyze" icon={<PieChart />} className={classes.content}/>
    <BottomNavigationAction label="learn" value="learn" icon={<LibraryBooks/>} className={classes.content}/>
    <BottomNavigationAction label="dashboard" value="dashboard" icon={<PermIdentity/>} className={classes.content}/>
  </BottomNavigation>
  </div>

我已经尝试将 React-Router 与这些预定义导航组件一起使用,但是没有用,有没有可能的方法将 Router 与 Material-UI 的 Button 导航一起使用?Material-UI ButtonNavigation API 中的按钮导航篇

2个回答

是的,这是可能的。你需要使用componentprops:

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

import BottomNavigation from '@material-ui/core/BottomNavigation';
import BottomNavigationAction from '@material-ui/core/BottomNavigationAction';

// ....

<BottomNavigation value={value} onChange={this.handleChange}>
    <BottomNavigationAction
        component={Link}
        to="/signal"
        label="signal"
        value="signal"
        icon={<ShowChart />}
        className={classes.content}
    />
</BottomNavigation>

toprops用于 React Router 的Link组件)

这适用于任何继承自ButtonBase.

https://material-ui.com/api/bottom-navigation-action/

inheritance

ButtonBase 组件的属性也可用。您可以利用此行为来定位嵌套组件。

https://material-ui.com/api/button-base/

props

component- 用于根节点的组件。使用 DOM 元素或组件的字符串。

只是为了添加@thirtydot 的精彩答案,以防用户输入搜索并直接访问特定网页(默认除外),例如“www.yoursite.com/tab2”,而不是单击第二个按钮,这可能会导致显示的站点与聚焦的底部导航按钮(通常是第一个按钮)之间不匹配。

这是我所做的:
我曾经window.location.pathname直接获取当前路径,即“/tab2”。
这是我的特定用例的代码....

function BottomNavBar(){
    const pathname = window.location.pathname; // in case user visits the path directly. The BottomNavBar is able to follow suit.
    const [value, setValue] = React.useState(pathname);
    const handleChange = (event, newValue) => {
      setValue(newValue);
    };

    return (
        <BottomNavigation value={value} onChange={handleChange} showLabels={true} >
          <BottomNavigationAction label="home" value="/" icon={<HomeIcon />} component={Link} to='/'/>
          <BottomNavigationAction label="resources" value="/resources" icon={<ResourcesIcon /> } component={Link} to='/resources'/>                
          <BottomNavigationAction label="Q&A" value="/qna" icon={<QnAIcon />}  component={Link} to='/qna'/>
          <BottomNavigationAction label="profile" value="/profile" icon={<ProfileIcon />} component={Link} to='/profile'/>
        </BottomNavigation>
      );
}