#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
, соответствующее условию.