νμ΅ ν€μλ
React Router 6.4
React Router λ²μ 6.4λΆν° μ§μνλ λΌμ°ν° κ°μ²΄
λ₯Ό λ§λ€μ΄μ μ¬μ©ν΄λ³΄μ.
μλμ κ°μ λ°©μμΌλ‘ React Routerλ₯Ό μ΄μ©ν΄μ λΌμ°ν° κ°μ²΄λ₯Ό λ§λ€μ΄μ μ¬μ©ν΄λ³΄μ.
import Header from './components/Header';
import Footer from './components/Footer';
import HomePage from './pages/HomePage';
import AboutPage from './pages/AboutPage';
// β¬οΈ React Routerλ₯Ό μ΄μ©ν΄μ λΌμ°ν° κ°μ²΄λ₯Ό λ§λ€μ΄ 보μ!
const pages = {
'/': HomePage,
'/about': AboutPage,
};
export default function App() {
const path = window.location.pathname;
const Page = Reflect.get(pages, path) || HomePage;
return (
<div>
<Header />
<main>
<Page />
</main>
<Footer />
</div>
);
}
React Router v6.4 μ μ¬μ©λ²
π€ App μ»΄ν¬λνΈμ 2κ°μ§ μν
νμ¬ App μ»΄ν¬λνΈλ 2κ°μ§ μν μ νκ³ μλ€. μ΄λ€ λ μ΄μμμ μ·¨νκ³ μλμ§
μ μ΄λ»κ² λΌμ°ν
μ΄ λλμ§
μ΄λ€.
// App.tsx
import { Routes, Route } from 'react-router-dom';
import HomePage from './pages/HomePage';
import AboutPage from './pages/AboutPage';
import Header from './components/Header';
import Footer from './components/Footer';
export default function App() {
return (
<div>
<Header />
<main>
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/about" element={<AboutPage />} />
</Routes>
</main>
<Footer />
</div>
);
}
π App μ»΄ν¬λνΈμμ 2κ°μ§ μνμ λΆλ¦¬ν΄λ³΄μ
RoutingPage μ»΄ν¬λνΈλ₯Ό μμ±ν΄μ λΌμ΄ν
κ³Ό κ΄λ ¨λ건 λκ²¨μ£Όκ³ , Appμ»΄ν¬λνΈλ λ μ΄μμ κ΄λ¦¬νλλ‘ λΆλ¦¬λμλ€. κ·Έλ λ€λ©΄ RoutingPage λ₯Ό κ°μ²΄λ°©μμΌλ‘ λ§λ€μ΄λ λμ§ μμκΉ?
import { Routes, Route, createBrowserRouter } from 'react-router-dom';
import HomePage from './pages/HomePage';
import AboutPage from './pages/AboutPage';
import Header from './components/Header';
import Footer from './components/Footer';
function RoutingPage() {
return (
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/about" element={<AboutPage />} />
</Routes>
);
}
export default function App() {
return (
<div>
<Header />
<main>
<RoutingPage />
</main>
<Footer />
</div>
);
}
π λΌμ°ν
μ²λ¦¬λ₯Ό λ
립μν€μ
Route μ»΄ν¬λνΈμ pathμ elementλ₯Ό 맡νν κ°μ²΄λ₯Ό κ°μ§λλ‘ νλ€.
const routes = [
{path: '/', element: <HomePage />},
{path: '/about', element: <AboutPage />},
];
createBrowserRouterλ₯Ό μ΄μ©ν΄μ λΌμ°ν° κ°μ²΄λ₯Ό μμ±νλ€. μ΄λ κ² μμ±λ λΌμ°ν° κ°μ²΄λ λΌμ°ν
μ μ²λ¦¬νλλ° μ¬μ©νλ€.
const router = createBrowserRouter(routes);
κ·Έλ¦¬κ³ RouterProviderλ₯Ό μ΄μ©ν΄μ router κ°μ²΄λ₯Ό μ°κ² λ€κ³ νλ€. μ΄λ κ² νλ©΄ μ ν리μΌμ΄μ
μ 체μμ λΌμ°ν
μ μ²λ¦¬ν μ μκ² λλ€.
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import HomePage from './pages/HomePage';
import AboutPage from './pages/AboutPage';
const routes = [
{ path: '/', element: <HomePage /> },
{ path: '/about', element: <AboutPage /> },
];
const router = createBrowserRouter(routes);
export default function App() {
return (
<RouterProvider router={router}></RouterProvider>
)
}
λ μ΄μ BrowserRouterκ° λΌμ°ν
μ κ΄λ¦¬νμ§ μλλ€. createBrowserRouter ν¨μμ RouterProvider μ»΄ν¬λνΈλ₯Ό μ¬μ©νμ¬ λΌμ°ν
μ μ€μ νκ³ κ΄λ¦¬νλ€. λλ¬Έμ main μ»΄ν¬λνΈμμ BrowserRouter μ»΄ν¬λνΈλ μ κ±°νλ€.
π λ μ΄μμ λ
립 μν€κΈ°
λΆκΈ°μμ μ΄ μκΈ° λλ¬Έμ μμ λ°©μμ²λΌ μ¬μ©νλ건 λ무 λΆνΈνλ€. λ μ΄μμ μ체λ₯Ό λ€μκ³Ό κ°μ΄ μ»΄ν¬λνΈλ‘ λ
립μν¨λ€.
function Layout() {
return (
<div>
<Header />
<main>
{/* <RoutingPage /> */}
<Outlet />
</main>
<Footer />
</div>
);
}
routesνν
Layout μ»΄ν¬λνΈμ μ μ©νλ€λ κ²μ μ‘μμ€μΌ νλ€. κ·Έλ €μ§λ κ²μ λͺ¨λ <Layout />
μΌλ‘ κ·Έλ €μ§λλ‘ ν΄μΌ νλ€.
μ΄λ₯Ό μν΄μ routesλ₯Ό κ³μΈ΅νμΌλ‘ λ°κΎΈμλ€.
const routes = [
{
element: <Layout />,
children: [
{ path: '/', element: <HomePage /> },
{ path: '/about', element: <AboutPage /> },
],
},
];
λ€λ§ Layout μ»΄ν¬λνΈκ° HomePage μ»΄ν¬λνΈμ AboutPage μ»΄ν¬λνΈλ₯Ό μΈμ§ν΄μ μ¬λ°λ₯Έ μμΉμ λ£μ΄μΌ νλ€. μ΄λ React Routerκ° μ§μνλ μ»΄ν¬λνΈμΈ Outlet μ μ°λ©΄λλ€.
Outlet μ»΄ν¬λνΈλ Layout μ»΄ν¬λνΈ μμ μ μλ λ μ΄μμ ꡬ쑰λ₯Ό κ·Έλλ‘ μ μ§νλ©΄μ μ»΄ν¬λνΈλ₯Ό λμ μΌλ‘ λ λλ§ ν μ μλ€.
import { createBrowserRouter, RouterProvider, Outlet } from 'react-router-dom';
import HomePage from './pages/HomePage';
import AboutPage from './pages/AboutPage';
import Header from './components/Header';
import Footer from './components/Footer';
function Layout() {
return (
<div>
<Header />
<main>
<Outlet />
</main>
<Footer />
</div>
);
}
const routes = [
{
element: <Layout />,
children: [
{ path: '/', element: <HomePage /> },
{ path: '/about', element: <AboutPage /> },
],
},
];
const router = createBrowserRouter(routes);
export default function App() {
return <RouterProvider router={router}></RouterProvider>;
}
π νμΌλ‘ λΆλ¦¬νμ
routesλ ν
μ€νΈ λ νμν μ 보μ΄λ€. κ·Έλμ App.tsx νμΌμμ λΆλ¦¬νλκ² κ°μ Έλ€μ°κΈ°μ μ’λ€.
- src
- components
- Footer.tsx
- Header.tsx
- Layout.tsx β
- pages
- AboutPage.tsx
- HomePage.tsx
- App.tsx
- main.tsx
- routes.tsx β
π§ App μ»΄ν¬λνΈλ ν μΌμ΄ μλ€?
App μ»΄ν¬λνΈκ° νλ μΌμ΄ μ€μλ€. μ΄ μΌμ main μ»΄ν¬λνΈμ 보λ΄λ λλ μΌμ΄λΌμ App μ»΄ν¬λνΈκ° νμ μμ΄μ‘λ€.
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import routes from './routes';
const router = createBrowserRouter(routes);
export default function App() {
return <RouterProvider router={router}></RouterProvider>;
}
π οΈ λΌμ°ν
ν
μ€νΈ νκΈ°
μ΄μ μλ App.test.tsxλ‘ App μ»΄ν¬λνΈλ₯Ό ν
μ€νΈνλ€. μ΄μ λ routesκ° μ»΄ν¬λνΈμ λ μ΄μμμ λν μ 보λ₯Ό λͺ¨λ λ€κ³ μλ€. λλ¬Έμ routesλ§ ν
μ€νΈ νλ©΄ λλ€.
MemoryRouter
λ μ£Όμλ₯Ό κ°μ§κ³ μμ§ μμ, μ£Όμλ₯Ό λ°λ‘ μ‘μ μ€ κ²μ²λΌ createMemoryRouterλ₯Ό μ¬μ©ν΄μ ν
μ€νΈ νλ€.
// App.test.tsx β routes.test.tsx
import { render, screen } from '@testing-library/react';
import { createMemoryRouter, RouterProvider } from 'react-router-dom';
import routes from './routes';
const context = describe;
describe('App', () => {
function renderRouter(path: string) {
const router = createMemoryRouter(routes, { initialEntries: [path] });
render(<RouterProvider router={router} />);
}
context('when the current path is β/β', () => {
it('renders the home page', () => {
renderRouter('/');
screen.getByText(/νμ/);
});
});
context('when the current path is β/aboutβ', () => {
it('renders the about page', () => {
renderRouter('/about');
screen.getByText('aboutμ λν μ 보λ₯Ό κ°μ§κ³ μμ΄μ!');
});
});
});
π μ°Έκ³
Last updated