React Router v6.3을 사용하는 동적 페이지
이것을 React에서 어떻게 구현할 수 있는지 봅시다. Ghibli API를 사용하여 영화 목록을 가져오고 모든 영화에 대한 동적 페이지와 경로를 구현할 것입니다. 영화를 클릭하면 해당 영화에 대한 자세한 정보를 표시하는 동적 페이지로 이동합니다.
1 단계
create-react-app을 사용하여 새로운 React 프로젝트를 생성합니다. 또한 터미널을 통해 프로젝트 폴더에서 'npm install react-router-dom'을 실행하여 React Router를 설치합니다. react-router-dom 패키지에는 웹 애플리케이션에서 React Router를 사용하기 위한 바인딩이 포함되어 있습니다.
App.js 파일을 열고 기본 코드를 제거하고 다음을 추가합니다.
import React from "react";
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import MoviePage from "./MoviePage";
import HomePage from "./HomePage";
const App = () => {
return (
<div>
<Router>
<Routes>
<Route exact path="/" element={<HomePage />} />
<Route path="/movie/:movieId" element={<MoviePage />} />
</Routes>
</Router>
</div>
);
};
export default App;
2 단계
홈페이지라는 또 다른 별도의 구성 요소를 만듭니다. 이것은 영화 데이터를 얻기 위해 Ghibli API를 호출하는 우리의 홈페이지가 될 것입니다. App.js에서 이 구성 요소에 대한 경로를 이미 정의했습니다. 이제 API 호출을 추가해 보겠습니다.
import React, { useState, useEffect } from "react";
import { Link } from "react-router-dom";
const HomePage = () => {
const [isLoading, setIsLoading] = useState(true);
const [data, setData] = useState();
useEffect(() => {
fetch("https://ghibliapi.herokuapp.com/films", {})
.then((res) => res.json())
.then((response) => {
setData(response);
setIsLoading(false);
})
.catch((error) => console.log(error));
}, []);
console.log("Data!", data);
return (
<>
{!isLoading &&
data.map((movie) => {
return (
<h5 key={movie.id}>
<Link to={`/movie/${movie.id}`}>{movie.title}'s Page</Link>
</h5>
);
})}
</>
);
};
export default HomePage;
두 가지 상태가 있습니다. true 또는 false일 수 있는 isLoading은 API에서 데이터를 수신했는지 여부를 알려줍니다.
HomePage 구성 요소가 렌더링될 때 useEffect 후크를 사용하여 데이터를 가져옵니다. API에서 데이터를 가져올 때 우리는 isLoading의 값을 false로 설정하고 데이터를 우리가 얻는 JSON으로 설정합니다.
이제 HomePage 구성 요소 내부의 jsx를 보면 isLoading 값을 확인하고 false인 경우 응답 데이터를 통해 매핑하여 영화 이름을 렌더링하는 것을 볼 수 있습니다.
'npm start'로 앱을 실행하면 화면에 영화 이름이 표시되어야 합니다.
3단계
그러나 우리는 영화 목록만 원하는 것이 아니라 각 영화에 대한 동적 경로가 있는 별도의 페이지도 원합니다.
따라서 각 영화의 세부 정보를 가져오는 API에서 데이터를 가져오는 MoviePage라는 또 다른 구성 요소를 만들어 보겠습니다.
import React, { useState, useEffect } from "react";
import { Link, useParams } from "react-router-dom";
const MoviePage = () => {
const { movieId } = useParams();
const [isLoading, setIsLoading] = useState(true);
const [data, setData] = useState();
useEffect(() => {
fetch(`https://ghibliapi.herokuapp.com/films/${movieId}`, {})
.then((res) => res.json())
.then((response) => {
setData(response);
setIsLoading(false);
console.log(`https://ghibliapi.herokuapp.com/films/${movieId}`);
})
.catch((error) => console.log(error));
}, [movieId]);
console.log(data);
return (
<>
{!isLoading && (
<>
<h1>Title: {data.title}</h1>
<h2>Plot: {data.description}</h2>
<Link to="/">Back to homepage</Link>
</>
)}
</>
);
};
export default MoviePage;
HomePage와 같은 방식으로 API에서 데이터를 가져와 각 사람에 대한 세부 정보를 나열하는 MoviePage 구성 요소를 정의했습니다. 또한 이 구성 요소에 대한 새 경로(예: movie/:movieId)를 정의했습니다. 이것은 우리의 일반 노선과 약간 다릅니다. 여기에서 경로를 통해 매개 변수 movieId를 전달합니다. 그런 식으로 해당 경로의 단일 구성 요소는 해당 매개 변수를 기반으로 동적일 수 있습니다.
HomePage는 동영상 ID를 경로 매개변수로 사용하여 이 동적 경로에 대한 링크를 반환합니다.
MoviePage를 면밀히 관찰하면 구조는 동일하게 유지되지만 페이지의 모든 콘텐츠는 movieId에 따라 달라집니다. 즉, 구성 요소가 완전히 동적임을 알 수 있습니다.
useParams 후크는 현재 URL에서 . 하위 경로는 상위 경로에서 모든 매개변수를 상속합니다. useParams 후크를 사용하면 현재 경로의 매개변수에 액세스할 수 있습니다.
결론
React Router에 대한 더 많은 통찰력을 얻으려면 공식 문서를 읽으십시오.
React Router Docs
Reference
이 문제에 관하여(React Router v6.3을 사용하는 동적 페이지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/keitharogo/dynamic-pages-using-react-router-v63-42pk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)