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

#reactjs #react-router

#reactjs #react-маршрутизатор

Вопрос:

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

Это мой app.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;
  

Если необходимо, это мой класс navbar:

 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://www.youtube.com/watch?v=NUQkajBdnmQ

Комментарии:

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

Ответ №1:

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="/" Маршрут.

Ответ №2:

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

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

Это отобразило бы первое Route или Redirect , соответствующее условию.