🪨 라우팅을 설정하는 가장 기본적인 방법은 정적라우팅이다.
정적 라우팅이란 Router 컴포넌트에서 미리 어플리케이션에서 사용할 수 있는 경로들과 해당 경로로 접속했을 때 보여줄 컴포넌트를 모두 정의해두는 방식.
하지만 규모가 큰 어플리케이션에서는 경로를 미리 설정하는 방식만으로는 처리하기 힘든 상황이 생길 수 있다.
🤸 동적 라우팅은 기존처럼 Route를 설정할 때 URL의 전체 형태를 미리 정의하는 것이 아니라 특정 규칙을 정의한 후 규칙에 부합하는 URL이 있을 경우에 해당하는 element를 보여주도록 설정하는 방식으로 정적 라우팅에서 발생하는 문제를 해결한다. 애플리케이션을 확장성있게 만들 수 있다. 포스트가 추가되거나 삭제되는 등 변동이 생기더라도 Router 컴포넌트를 직접 수정하지 않아도 된다.
⬅️ 왼쪽: 정적 라우팅 -> URL의 전체 형태를 미리 정의해야 한다.
➡️ 오른쪽: 동적 라우팅 -> /post/로 시작하는 모든 URL은 상세페이지로 연결되게 설정하는 방식이다.
아래와 같이 동일한 부분(/post/)뒤에 콜론을 입력한 후 그 뒤에 문자열 형태로 path를 설정하면 URL에서 경로 뒤에 무슨 글자가 오든 이 Route로 연결이 돼 Detail 컴포넌트를 보여주게 된다.
이때 콜론 뒤에 오는 문자열을 path parameter라고 한다.
<Route path="/post/:문자열" element={<Detail />} />
path parameter를 통해 큰 틀은 동일하되 다른 UI를 보여줄 수 있도록 처리할 수 있다.
path parameter는 URL에 있는 값을 마치 매개변수처럼 사용한다.
유저가 예시처럼 아래의 url로 접속했을 경우 id라는 이름에 1이라는 값이 전달된다.
컴포넌트 안에서 path parameter로 전달된 값을 이용해 특정 처리를 하는 코드를 작성한다면 동일한 컴포넌트에서 다양한 UI를 보여줄 수 있을 것이다.
// url : localhost:3000/post/1
<Route path="/post/:id" element={<Detail />} />
import React from "react";
import { Link, useParams } from "react-router-dom";
import "./Detail.scss";
const Detail = () => {
const params = useParams(); {// id: 1}
return (
<section className="detail">
<h1>This is Detail Page</h1>
<h2>path parameter = {params.id}</h2>
);
};
export default Detail;
List.js
{users.map({id, first_name, email, avatar}) => (<Link key={id} to={`/detail/${id}`}>)}
Detail.js
import React from "react";
import { useParams } from "react-router-dom";
import "./Detail.scss";
// 단일 유저의 정보를 응답 : "https://reqres.in/api/users/[user의 ID]"
const Detail = () => {
const params = useParams();
const userId = params.id;
const [user, setUser] = useState();
useEffect(() => {
fetch(`https://reqres.in/api/users/${userId}`)
.then(res => res.json())
.then(result => setUser(result.data));
}, [userId])
const {first_name, email, avatar} = user;
return (
<section className="detail">
<article>
<p>
<strong>{first_name}</strong>
</p>
<p>{email}</p>
<img alt="avatar" src={avatar} />
</article>
</section>
);
};
export default Detail;