【问题标题】:How to switch components using navigation in React?如何在 React 中使用导航切换组件?
【发布时间】:2019-09-05 18:16:03
【问题描述】:

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

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

我尝试创建 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>

【问题讨论】:

  • 所有指向导航组件的路线,我不太了解代码,为什么不在 Navigation.js 中指定每个路径及其组件,而不是为所有路径传递导航
  • 因为如果我在 App.js 中使用其组件指示路径,它将不会显示导航。它将仅显示相应的组件而不显示导航。那是问题

标签: javascript reactjs material-ui jsx


【解决方案1】:

我通过创建 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>

【讨论】:

    【解决方案2】:

    这是您需要的方法。将标题导航与其他组件分开。

    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>
    

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

      创建一个名为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组件中的路径名

      【讨论】:

      • 它在渲染内的导航组件中给出错误“TypeError:无法读取未定义的属性'路径名'”
      猜你喜欢
      • 2021-04-26
      • 2020-06-07
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      相关资源
      最近更新 更多