
npm i react-router-dom @types/react-router-dom --save
이게 리액트 라우트 돔이라는 건데, 이걸 이용하면 정말 쉽게 라우터를 지정해줄 수 있어. 여기서 지원하는 걸로 404를 따로 못 지정한 에러도 404나 맞는 걸로 에러를 뜨게 해줄 수 있다는 것이 정말 좋은 장점인 것 같애.
const router = createBrowserRouter([
{
path: "/",
element: (
<Layout>
<Home />
</Layout>
),
errorElement: <Error />,
},
{
path: "/books",
element: (
<Layout>
<div>도서 목록</div>
</Layout>
),
},
]);
path: URL 경로
"/": 홈페이지 (예: http://localhost:3000/)"/books": 도서 목록 페이지 (예: http://localhost:3000/books)element: 해당 경로에서 보여줄 컴포넌트
<Layout>으로 감싸서 Header/Footer 자동 적용errorElement: 에러 발생시 보여줄 페이지
<Link to="/">
<img src={logo} alt="book store" />
</Link>
의미:
/ 경로로 이동 (홈페이지)<a> 태그와 비슷하지만 새로고침 안 됨!<Link to={item.id === null ? "/books" : `/books?category_id=${item.id}`}>
{item.name}
</Link>
의미:
item.id가 null이면 → /books 이동item.id가 0이면 → /books?category_id=0 이동item.id가 1이면 → /books?category_id=1 이동<a href="/login">
<FaSignInAlt />
로그인
</a>
문제점:
<Link to="/login">
<FaSignInAlt />
로그인
</Link>
장점:
{CATEGORY.map((item) => (
<li key={item.id === null ? "all" : item.id}>
<Link to={item.id === null ? "/books" : `/books?category_id=${item.id}`}>
{item.name}
</Link>
</li>
))}
결과:
/books/books?category_id=0/books?category_id=1/books?category_id=2/books?category_id=0
↑
물음표 뒤에 붙는 데이터
의미:
/books)지만category_id 값을 읽어서 필터링함1. 사용자가 "소설" 클릭
↓
2. Link가 `/books?category_id=1`로 이동
↓
3. router가 `/books` 경로 찾음
↓
4. `/books` 페이지 컴포넌트 렌더링
↓
5. 컴포넌트에서 `category_id=1` 읽어서 소설 목록만 보여줌
import { createBrowserRouter, RouterProvider } from "react-router-dom";
// 라우터 생성
const router = createBrowserRouter([...]);
// App.tsx에서 사용
function App() {
return <RouterProvider router={router} />;
}
TypeScript 특징:
createBrowserRouter가 자동으로 타입 추론path, element 등의 속성 자동완성<a> 태그 대신 사용to 속성에 이동할 경로 지정?key=value 형식"URL 바꾸면서 새로고침 안 하는 게 React Router의 핵심!"