Front-End/React(비공)
[React] React Router 리액트 라우터 1
리리히히
2024. 3. 21. 13:26
반응형
☑️BrowserRouter(v5) vs. createBrowserRouter
- BrowserRouter는 버전 5에서 사용
- createBrowserRouter라는 API 버전 6에 등장
☑️Route들이 errorElement를 가지게 된다.
npm i react-router-dom@6.4
🔎 폴더 및 파일 생성
- src/screens/About.tsx
- src/screens/Home.tsx
- src/components/Header.tsx : 어떤 페이지로 가도 불러올 수 있는 헤더 페이지
- src/Router.tsx
📌 V5. BrowserRouter
//About.tsx
function About() {
return <h1>About</h1>
}
export default About;
//Home.tsx
function Home() {
return <h1>Home</h1>
}
export default Home;
//Header.tsx
import { Link } from "react-router-dom";
function Header() {
return (
<header>
<ul>
<li><Link to={"/"}></Link></li>
<li><Link to={"/about"}>About</Link></li>
</ul>
</header>
);
}
export default Header;
//Router.tsx
import {BrowserRouter, Route, Routes} from "react-router-dom"
import Header from "./components/Header";
import Home from "./screens/Home";
import About from "./screens/About";
function Router(){
return <BrowserRouter>
<Header />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</BrowserRouter>
}
export default Router;
- Router안에 Routes를 적어준다.
- Header페이지를 BrouwserRouter안에 넣어야 한다.
- Header의 Link를 사용하기 위해서는 Router 안에 넣어야한다.
- Router 밖에서는 Link를 render할 수 없다.
//App.tsx
import Router from "./Router";
function App (){
return <div>
<Router />
</div>;
}
export default App;
- App.tsx에 Router를 import
📌 V6. createBrowserRouter
- JSX컴포넌트를 사용하지 않고도 브라우저를 좀 더 선언적으로 바꿔줌
//Router.tsx
import {createBrowserRouter, Route, Routes} from "react-router-dom"
import Root from "./Root";
import About from "./screens/About";
import Home from "./screens/Home";
const router = createBrowserRouter([
{
path:"/", //path 지정
element: <Root />, //Root element를 Render
children: [
{
path:"",
element: <Home />,
},
{
path:"about",
element: <About />,
},
]
}
])
export default router;
- Home화면과 About화면을 render 하는 것이 목표
- path:"/"를 부모요소로 생각
- Home, About은 자식요소로 생각
- router를 array 형식으로 표현할 수 있다.
- 맨 처음으로 전체 route들의 컨테이너를 만들어 준다.
//Root.tsx
import React from "react";
import { Outlet } from "react-router-dom";
import Header from "./components/Header";
function Root (){
return (
<div>
<Header />
<Outlet />
</div>
);
}
export default Root;
- App.tsx는 더이상 Router를 render해주지 않는다.
- App.tsx ➡️ Root.tsx 파일명 변경
//index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import { RouterProvider } from 'react-router-dom';
import router from './Router';
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
root.render(
<React.StrictMode>
<RouterProvider router={router}/>
{/* RouterProvider는 router라고 불리는 prop을 가진다 */}
</React.StrictMode>
);
- index.tsx 렌더하지 않는 컴포넌트를 제거 (기존 코드 삭제)
- RouterProvider를 렌더 (CreateBrowserRouter 함수를 통해서 만들어 냄)
➡️ router라고 불리는 prop을 가진다.
📌 NotFound 페이지 (errorElement가 버전 6에서 추가 됨)
- src/screens/NotFound.tsx
//NotFound.tsx
function NotFound(){
return <h1>
404 Not Found.
</h1>
}
export default NotFound;
//Router.tsx
import {createBrowserRouter, Route, Routes} from "react-router-dom"
import Root from "./Root";
import About from "./screens/About";
import Home from "./screens/Home";
import NotFound from "./screens/NotFound";
const router = createBrowserRouter([
{
path:"/", //path 지정
element: <Root />, //Root element를 Render
children: [
{
path:"",
element: <Home />,
},
{
path:"about",
element: <About />,
},
],
errorElement: <NotFound />
}
])
export default router;
- Root element path에 에러를 추가할 수 있음.
- errorElement는 컴포넌트가 충돌나도 작동.
- http://localhost:3000뒤에 임의적으로 주소를 바꿔주면 에러 메세지가 뜨는 것을 확인할 수 있음.
반응형