Я думаю, что вы достаточно близки к рекомендуемой реализации, вам нужно всего несколько небольших настроек.
Во-первых,
В вашем файле App.js
, который вы 'фактически обрабатывая маршрутизацию, без использования компонента <Switch>
, предоставляемого React Router, заменив теги <div>
и </div>
в вашем файле App.js
на <Switch>
и </Switch>
соответственно , если getэто работает для вас.См. Ниже ...
import React from "react";
import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; //make sure you import it also!
import Home from './pages/Home';
import Page from './pages/Page';
import Blog from './pages/Blog';
import Header from './components/Header';
import Footer from './components/Footer';
class App extends React.Component {
render() {
return (
<Router>
<Switch> //Add this in
<Header />
<Route exact path="/" component={Home} />
<Route path="/blog/:slug" component={Blog} />
<Route path="/:slug" component={Page} />
<Footer />
</Switch> //Add this in
</Router>
);
}
}
export default App;
Я бы порекомендовал пойти еще дальше!
Чтобы сделать эти компоненты более понятными, вам следует провести рефакторинг функциональность маршрутизации в файл routes.js
и верхний уровень логика / структура компонента приложения в файл App.js
.См. Ниже ...
In App.js
:
Этот файл предназначен для обработки структуры и логики базового приложения.Например, в этот файл вы импортируете <Header>
, <Footer>
и компонент Route
.
import * as React from 'react'
import Header from './../Header/Header.jsx'
import Footer from './../Footer/Footer.jsx'
class App extends React.Component {
constructor(props) {
super(props)
this.state = {
// Handle your top-level application state here
}
}
// define your top-level application functions here
render() {
return (
<div>
<Header />
<main>
{this.props.children} //This where the Route components will render
</main>
<Footer />
</div>
)
}
}
export default App
In Routes.js
:
В этом файле вы должны import
свой App
компонент, а затем обрабатывать операторы маршрутизации.
import React from 'react'
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'
import App from './components/App'
import Home from './pages/Home'
import Page from './pages/Page'
import Blog from './pages/Blog'
/* construct routes */
export default () => {
return (
<Router>
<App>
<Switch>
<Route path='/' exact component={Home} />
<Route path='/blog/:slug' component={Blog} />
<Route path='/:slug' component={Page} />
</Switch>
</App>
</Router>
)
}
Если вы структурируете свое приложение таким образом, ваша логика маршрутизации и верхняя частьлогика приложений высокого уровня разделена, и в конце концов ваши файлы будут менее загромождены, так как и файлы маршрутов, и файлы приложений верхнего уровня могут стать довольно плотными.
Надеюсь, это поможет!Дайте мне знать, если я смогу что-нибудь объяснить.