Ссылка на CodeSandbox , чтобы увидеть, что я имею в виду.
Когда вы загружаете приложение с установленным маршрутизатором / коммутатором, веб-приложение вообще не загружается. Пустой белый экран.
Однако, если вы закомментируете код ниже:
<Switch>
<Route exact path="/" component={App} />
<Route
exact
path="/tavares"
component={() => <Tavares data={data.tavares} />}
/>
<Route
exact
path="/matthews"
component={() => <Matthews data={data.matthews} />}
/>
<Route
exact
path="/marner"
component={() => <Marner data={data.marner} />}
/>
</Switch>
Приложение загрузится снова.
Я собираю данные трех игроков из API НХЛ, и этот код выше передает данные в другие компоненты. Я не уверен, вызывает ли это какое-то отставание или что-то подобное.
Приложение. js
import React, { useState, useEffect } from "react";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import { Container, Row, Col, Card } from "reactstrap";
import ReactDOM from "react-dom";
import axios from "axios";
import styled from "styled-components";
import { createGlobalStyle } from "styled-components";
import "bootstrap/dist/css/bootstrap.min.css";
import Intro from "./components/Intro";
import Tavares from "./components/Tavares";
import Matthews from "./components/Matthews";
import Marner from "./components/Marner";
import TavaresImg from "./img/tavares.jpg";
import MatthewsImg from "./img/matthews.jpg";
import MarnerImg from "./img/marner.jpg";
import "./styles.css";
function App() {
// Set initial state for data
const [data, setData] = useState({ tavares: [], matthews: [], marner: [] });
// Fetch data
useEffect(() => {
const fetchData = async () => {
// Grab all players API's
let tavares =
"https://statsapi.web.nhl.com/api/v1/people/8475166?expand=person.stats&stats=yearByYear,careerRegularSeason&expand=stats.team&site=en_nhlCA";
let matthews =
"https://statsapi.web.nhl.com/api/v1/people/8479318?expand=person.stats&stats=yearByYear,careerRegularSeason&expand=stats.team&site=en_nhlCA";
let marner =
"https://statsapi.web.nhl.com/api/v1/people/8478483?expand=person.stats&stats=yearByYear,careerRegularSeason&expand=stats.team&site=en_nhlCA";
// Axios to get all api's
axios
.all([axios.get(tavares), axios.get(matthews), axios.get(marner)])
.then(
axios.spread((tavares, matthews, marner) => {
setData({
tavares: [tavares.data.people[0]],
matthews: [matthews.data.people[0]],
marner: [marner.data.people[0]]
});
})
);
};
fetchData();
}, []);
return (
<>
<Router>
<GlobalStyle />
<Intro
main="Maple Leafs API"
text="Built with React, React Hooks, Styled Components and Axios
consuming the NHL's REST API."
/>
<Flex>
<Container>
<RowWrap>
<Row>
<Col lg="4">
<Image>
<img src={TavaresImg} alt="Tavares" />
</Image>
</Col>
<Col lg="8">
<CardBody>
{data.tavares.map(item => (
<>
<Title>
<h1>{item.fullName}</h1>
</Title>
<Number>{item.primaryNumber}</Number>
<p>{item.primaryPosition.name}</p>
</>
))}
<ButtonLink>
<Link to="/tavares">
<button>View Profile</button>
</Link>
</ButtonLink>
</CardBody>
</Col>
</Row>
</RowWrap>
<RowWrap>
<Row>
<Col lg="4">
<Image>
<img src={MatthewsImg} alt="Matthews" />
</Image>
</Col>
<Col lg="8">
<CardBody>
{data.matthews.map(item => (
<>
<Title>
<h1>{item.fullName}</h1>
</Title>
<Number>{item.primaryNumber}</Number>
<p>{item.primaryPosition.name}</p>
</>
))}
<ButtonLink>
<Link to="/matthews">
<button>View Profile</button>
</Link>
</ButtonLink>
</CardBody>
</Col>
</Row>
</RowWrap>
<RowWrap>
<Row>
<Col lg="4">
<Image>
<img src={MarnerImg} alt="Marner" />
</Image>
</Col>
<Col lg="8">
<CardBody>
{data.marner.map(item => (
<>
<Title>
<h1>{item.fullName}</h1>
</Title>
<Number>{item.primaryNumber}</Number>
<p>{item.primaryPosition.name}</p>
</>
))}
<ButtonLink>
<Link to="/marner">
<button>View Profile</button>
</Link>
</ButtonLink>
</CardBody>
</Col>
</Row>
</RowWrap>
</Container>
</Flex>
<Container>
<Row>
<Col lg="12">
<Switch>
<Route exact path="/" component={App} />
<Route
exact
path="/tavares"
component={() => <Tavares data={data.tavares} />}
/>
<Route
exact
path="/matthews"
component={() => <Matthews data={data.matthews} />}
/>
<Route
exact
path="/marner"
component={() => <Marner data={data.marner} />}
/>
</Switch>
</Col>
</Row>
</Container>
</Router>
</>
);
}
// Styles
const GlobalStyle = createGlobalStyle`
body,html {
background: #eaeaea;
padding-top: 20px;
font-family: 'Roboto', sans-serif;
}
`;
const Flex = styled.div`
display: flex;
`;
const Image = styled.div`
img {
width: 100%;
}
`;
const Title = styled.h1`
font-size: 20px !important;
font-weight: bold;
color: #396afc;
`;
const Number = styled.h3`
font-size: 30px;
`;
const RowWrap = styled.div`
margin-top: 30px;
background: #fff;
@media (min-width: 992px) {
.col-lg-4,
.col-lg-8 {
padding: 0px;
}
}
`;
const CardBody = styled.div`
padding: 30px;
text-align: center;
@media (min-width: 1200px) {
margin-top: 60px !important;
}
@media (min-width: 992px) {
margin-top: 30px;
}
`;
const ButtonLink = styled.div`
button {
width: 100%;
background: #396afc;
color: #fff;
border: none;
transition: 0.2s;
padding: 10px 0px 10px 0px;
&:hover {
background: #2846f7;
}
}
`;
export default App;
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);