React-Router не работает после использования тега Switch

я возился с React, и я пытался сделать какой-то переход между страницами маршрутизатора. До использования тега переключателя мой код работал нормально, но после этого ротер не работал, и никакие компоненты не отображались.

Это мое приложение.js

import React, { Component } from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";
import { CSSTransition, TransitionGroup } from "react-transition-group";
import "./App.scss";
import "./vendor/bootstrap/bootstrap-reboot.min.css";
import "./vendor/bootstrap/bootstrap-grid.css";
import Content from "./components/Content";
import Header from "./components/Header";
import Skills from "./components/Skills";
import Portfolio from "./components/Portfolio";
import Timeline from "./components/Timeline";
import Footer from "./components/Footer";
import Monitoria from "./components/Monitoria";
import About from "./components/About";
import Contact from "./components/Contact";

class App extends Component {
  state = {
    header_infos: [
      {
        job: "Desenvolvedor Web",
        college: "Faculdade Guararapes - Ciência da Computação 5º Período"
      }
    ]
  };

  render() {
    return (
      <BrowserRouter>
        <div className = "App">
          <Header />
          <Route
            render = {(location) => (
              <TransitionGroup>
                <CSSTransition
                  key = {location.key}
                  timeout = {300}
                  classNames = "fade"
                >
                  <Switch location = {location}>
                    <Route exact path = "/" component = {Header} />
                    <Route
                      exact
                      path = "/"
                      render = {() => (
                        <Content
                          job = {this.state.header_infos[0].job}
                          college = {this.state.header_infos[0].college}
                        />
                      )}
                    />
                    <Route exact path = "/" component = {Skills} />
                    <Route exact path = "/" component = {Portfolio} />
                    <Route exact path = "/" component = {Timeline} />
                    <Route path = "/monitoria" component = {Monitoria} />
                    <Route path = "/about" component = {About} />
                    <Route path = "/contact" component = {Contact} />
                  </Switch>
                </CSSTransition>
              </TransitionGroup>
            )}
          />
          <Footer />
        </div>
      </BrowserRouter>
    );
  }
}

export default App;

Если необходимо, это мой класс навигационной панели:

import React from "react";
import "../sass/Header.scss";
import { NavLink } from "react-router-dom";

const Header = () => {
  return (
    <header className = "">
      <NavLink exact to = "/">
        <h1 className = "logo">Logo</h1>
      </NavLink>
      <input type = "checkbox" id = "nav-toggle" className = "nav-toggle" />
      <nav>
        <ul>
          <li className = "menu-item">
            <NavLink to = "/monitoria">Monitoria</NavLink>
          </li>
          <li className = "menu-item">
            <NavLink to = "/about">Sobre</NavLink>
          </li>
          <NavLink to = "/contact" className = "btn-rounded">
            <li className = "menu-item">Fale comigo</li>
          </NavLink>
        </ul>
      </nav>
      <label htmlFor = "nav-toggle" className = "nav-toggle-label">
        <span />
      </label>
    </header>
  );
};

export default Header;

На самом деле, я не знаю, правильно ли я делал маршрутизатор раньше, потому что я использовал 3 . Причина в том, что мне нужно было загрузить только эти 3 компонента в мой индекс, и это был мой обходной путь.

До модификации я использовал только BrowserRouter и Route, без переключателя, и все работало нормально, но без анимации перехода. Итак, я попытался следовать одному учебнику, и в нем говорилось, что мне нужно использовать Switch, и теперь ничего не отображается, и я действительно не знаю, почему. Спасибо, как всегда.

Это руководство, которому я следовал: https://thewikihow.com/video_NUQkajBdnmQ

В качестве примечания я бы также рекомендовал изменить key = {location.key} на key = {location.pathname}, так как у меня возникла проблема с CssTransition, где, если вы находитесь на странице и щелкаете навигационную ссылку на тот же маршрут, он снова показывал переход, несмотря на то, что не необходимость повторного рендеринга

Jamie - Fenrir Digital Ltd 25.03.2019 03:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Switch будет отображать только первый совпадающий маршрут или перенаправление, поэтому будет отображаться только <Route exact path = "/" component = {Header} />, хотя кажется, что вы все равно уже визуализируете это до коммутатора.

<Route
  exact
  path = "/"
  render = {() => (
    <Content
      job = {this.state.header_infos[0].job}
      college = {this.state.header_infos[0].college}
    />
  )}
/>
<Route exact path = "/" component = {Skills} />
<Route exact path = "/" component = {Portfolio} />
<Route exact path = "/" component = {Timeline} />

Ни один из перечисленных выше компонентов не будет отображаться, поскольку коммутатор их игнорирует.

Лучше всего было бы создать родительский компонент для вещей, которые должны быть на пути /, и визуализировать его в первом (и единственном) exact path = "/" маршруте.

Я думаю, только ваш Header отрендерился бы с тем, что у вас есть прямо сейчас....

Если вы не хотите такого поведения, вы не должны использовать switch. Согласно его документации https://reacttraining.com/react-router/core/api/Switch

Он отобразит первый Route или Redirect, который соответствует условию.

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