【问题标题】:Is it possible to use material-ui button navigation with react-router?是否可以通过 react-router 使用 material-ui 按钮导航?
【发布时间】:2018-12-16 08:27:37
【问题描述】:

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

<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 的按钮导航一起使用? Material-UI中的按钮导航文章 ButtonNavigation API

【问题讨论】:

    标签: reactjs react-router material-ui react-router-dom


    【解决方案1】:

    是的,这是可能的。您需要使用component 道具:

    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>
    

    to 属性用于 React Router 的 Link 组件)

    这适用于任何继承自 ButtonBase 的 Material-UI 组件。

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

    继承

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

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

    道具

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

    【讨论】:

    • 你拯救了我的一天!非常感谢。
    • 如果您需要在访问 url 时将 BottomNavigationAction 显示为选中状态,您需要 1. 使用 useLocationreact-router-dom 获取当前位置 2. 使用 @987654332 将其提供给 BottomNavigation @ 3. 给每个BottomNavigationAction 适当的value 道具,例如`value="/about"
    【解决方案2】:

    只是为了补充@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>
          );
    }
    
    

    【讨论】:

    • 先阅读@thirtydot 的答案。
    • @mcKindo 没问题!很高兴这有帮助
    • 附加。而不是使用window.location.pathname(因为你必须解析它..想想如果url是'/tab2/123'的情况),我相信对于CRA用户,你很可能会使用react-router-大教堂。您应该使用它来获取路径。 import { useLocation } from 'react-router-dom' 或参考此other stackoverflow thread 了解其他替代方案
    猜你喜欢
    • 2021-05-30
    • 2020-05-18
    • 2019-10-22
    • 2020-05-25
    • 2022-08-21
    • 1970-01-01
    • 2017-03-03
    • 2019-01-09
    • 2020-02-06
    相关资源
    最近更新 更多