Как переключать компоненты с помощью навигации в React?

Я разрабатываю целевую страницу с помощью React. Он должен иметь одинаковую панель навигации для всех разделов и изменять только свое активное состояние.

В файле App.js я использовал BrowserRouter, который направляется к компоненту навигации. Моя проблема в том, что эта навигация не работает должным образом, она не переключает компоненты, она переключает только путь. Например, когда я нажимаю «Кабинет», он должен переключаться с компонента «Дом» на компонент «Кабинет». Должен ли я использовать другой маршрутизатор для навигации или нет? Что было бы лучшим решением для этого?

Я попытался создать компонент NavRouter, в котором я разместил маршрутизаторы для навигации.

Файл приложения.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 каждый путь с его компонентом вместо передачи навигации для всех из них

sh.alawneh 15.04.2019 19:59

Потому что если я укажу путь с его компонентами в App.js, он не будет показывать навигацию. Он будет отображать только соответствующие компоненты без навигации. Это проблема

Bositkhon Sultonov 15.04.2019 20:03
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
957
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

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

Выдает ошибку «TypeError: не удается прочитать свойство« путь »неопределенного» в компоненте навигации внутри рендеринга.

Bositkhon Sultonov 15.04.2019 20:14

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

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>
Ответ принят как подходящий

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

Другие вопросы по теме