如何在React中使用导航切换组件?

时间:2019-04-15 17:46:06

标签: javascript reactjs material-ui jsx

我正在使用React开发一个登陆页面。对于所有部分,它应该具有相同的导航栏,并且仅更改其活动状态。

在App.js文件中,我使用了浏览器路由,该浏览器路由到导航组件。我的问题是,导航无法正常工作,不能切换组件,只能切换路径名。例如,当我按下Cabinet时,它应该从Home切换到Cabinet组件。是否应使用其他路由器进行导航?最好的解决方案是什么?

我尝试创建NavRouter组件,在其中放置了用于导航的路由器。

App.js文件:

<BrowserRouter>
   <Switch>
        <Route path='/' exact component={ Navigation }></Route>
        <Route path='/cabinet' component={ Navigation }></Route>
        <Route path='/catalog' component={ Navigation }></Route>
        <Route path='/company' component={ Navigation }></Route>
        <Route path='/contacts' component={ Navigation }></Route>
   </Switch>
</BrowserRouter>

导航文件:

class Navigation extends Component {
render() {
const { classes, location: {pathname}, children  } = this.props;
return (
  <div>

  <MuiThemeProvider theme={color}>
  <Fragment>
  <nav id="menu">
  <ul  className="navigation">
  <li>
      <MenuItem component={Link} to='/' selected={'/' === pathname} className="active menuItem" className={classes.menuItemColor}>
          Главная
      </MenuItem>
    </li>
    <li>
      <MenuItem component={Link} to='/cabinet' selected={'/cabinet' === pathname} className="menuItem" className={classes.menuItemColor}>
          Кабинет
      </MenuItem>
      </li>
      <li>
      <MenuItem component={Link} to='/catalog' selected={'/catalog' === pathname} className="menuItem" className={classes.menuItemColor}>
          Каталог
      </MenuItem>
      </li>
      <li>
      <MenuItem component={Link} to='/company' selected={'/company' === pathname } className="menuItem" className="">
          Компания
      </MenuItem>
      </li>
      <li>
      <MenuItem component={Link} to='/contacts' selected={'/contacts' === pathname} className="menuItem" className="">
          Контакты
      </MenuItem>
      </li>
      </ul>

  </nav>
  <main className={classes.content}>
        { children }
    </main>
    </Fragment>
  </MuiThemeProvider>
  </div>
);
 }
}

NavRouter.js文件:

<BrowserRouter>
     <Navigation>
     <Switch>
         <Route path='/' exact component={ Navigation }></Route>
         <Route path='/home' component={ Home }></Route>
     </Switch>
     </Navigation>
    </BrowserRouter>

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

创建一个名为Routes.js

的文件

在Routes.js中:

export default () => (
        <BrowserRouter>
       <Switch>
            <Route path='/' exact component={ Home }></Route>
            <Route path='/cabinet' component={ Cabinet }></Route>
            <Route path='/catalog' component={ Catalog }></Route>
            <Route path='/company' component={ Company }></Route>
            <Route path='/contacts' component={ Contacts }></Route>
       </Switch>
    </BrowserRouter>
)

在App.js中

    import Routes from './Routes';
    import Navigation from './Navigation'
    //inside render
    <Navigation>
        <Routes />
    </Navigation>

注意:要获取当前路径名,您必须使用状态管理解决方案,例如Redux。

:如果您不熟悉redux,现在可以使用window.location.pathname

代替Navigation组件中的路径名。

答案 1 :(得分:0)

这是您需要执行的操作。将标题导航与其他组件分开。

  

App.js

   <Navigation/>
   <BrowserRouter>
       <Switch>
            <Route path='/' exact component={ Home }></Route>
            <Route path='/cabinet' component={ Cabinet }></Route>
            <Route path='/catalog' component={ Catalog }></Route>
            <Route path='/company' component={ Company }></Route>
            <Route path='/contacts' component={ Contacts }></Route>
       </Switch>
    </BrowserRouter>

答案 2 :(得分:0)

我已经通过创建Root.js文件(已将组件放置在其中)解决了我的问题

class Root extends Component {
render() {
return (
  <div>
    <MainNavigation />
    <TopNav />
    {this.props.children}
    </div>
);
}
}

在App.js文件中,我将其放置了:

<BrowserRouter>
        <Root>
          <Route path='/' exact component={ Home } />
          <Route path='/cabinet' component={ Cabinet } />
          <Route path='/catalog' component={ Catalog } />
          <Route path='/company' component={ Company } />
          <Route path='/contacts' component={ Contacts } />
        </Root>
</BrowserRouter>