Как переключать компоненты с помощью навигации в React? - PullRequest
0 голосов
/ 15 апреля 2019

Я занимаюсь разработкой целевой страницы с использованием 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>

Ответы [ 3 ]

0 голосов
/ 15 апреля 2019

Вот как вам нужно это сделать. Отделите навигацию заголовка от других компонентов.

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>
0 голосов
/ 17 апреля 2019

Я решил свою проблему, создав файл 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>
0 голосов
/ 15 апреля 2019

вы можете сделать следующее:

создать файл с именем 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.

или : если вы не знакомы сприставка, пока вместо имени пути в компоненте Навигация вы можете использовать window.location.pathname

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...