// 라우터, Router
- 웹 애플리케이션에서 다양한 페이지 간의 이동을 관리해주는 도구
- SPA(Single Page Application)에서 client side routing 을 가능하게 해준다.
- 페이지를 새로고침하지 않고도 URL을 변경할 수 있다.(컴포넌트 렌더링 가능)
1. 설치
npm install react-router-dom
2. route 정의
import { createBrowserRouter } from 'react-router-dom';
const router = createBrowserRouter([{ path: '/경로', element: jsx코드 }]);
- createBrowserRouter() 함수를 호출하고 그 함수에 route definition 객체 배열을 전달한다.
- path: 이동할 url 경로
- element: 해당 url에서 렌더링될 내용(jsx 코드)
3. router 활성화 및 route 로딩
const router = createBrowserRouter([{ path: '/경로', element: jsx코드 }]);
function 컴포넌트명() {
return <RouterProvider router={router} />;
}
- 정의한 router를 사용한다고 react에게 알리기 위해 RouterProvider 컴포넌트를 사용한다.
- RouterProvider 의 필수 property로 router를 전달한다.
- createRoutesFromElements도 사용 가능하다.
import { createBrowserRouter, createRoutesFromElements, Route } from 'react-router-dom';
const routeDefinitions명 = createRoutesFromElements(
<Route>
<Route path="/url" element={jsx코드(컴포넌트)} />
</Route>,
);
const router = createBrowserRouter(routeDefinitions명);
4. 페이지 이동
import { Link } from 'react-router-dom';
<Link to="/url"></Link>
- 전송하는 브라우저 기본 설정을 막고 router 정의를 참고하여 페이지를 이동한다.
import { Link } from 'react-router-dom';
<NavLink
to="/url"
className={({ isActive }) => isActive ? }
end
>
- react-router-dom이 isActive property를 제공해주기 때문에 해당 link가 활성화되어 있는지 알 수 있다.
- 만약 정확히 해당 링크와 일치할 때만 활성화되기를 원한다면, end property를 추가한다.
const navigate = useNavigate();
navigate('/url');
- useNavigate()는 프로그램적으로 페이지를 이동해야 할 때 사용한다.
※ Link에 data 같이 보내기
import { Link } from 'react-router-dom';
<Link to="/url" state={보낼data}></Link>
// children
1. route 정의 + router 활성화 및 route 로딩
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
const router = createBrowserRouter([
{
path: '/url',
element: jsx코드,
children: [
{ index: true, element: jsx코드 },
{ path: '/url', element: jsx코드 },
],
},
]);
function 컴포넌트명() {
return <RouterProvider router={router} />;
}
- createBrowserRouter로 router를 정의할 때 property로 children을 추가할 수 있다.
- 그러면 해당 route는 children router들의 부모 route 역할을 한다.
- path 대신 index property를 true로 설정하면, 부모 path에 있을 때 항상 해당 라우트가 활성화된다.
2. 부모 route 컴포넌트에서 children 설정
function 부모route컴포넌트명() {
return (
<>
<Outlet /> <!--children렌더링 -->
</>
);
}
- Outelet 컴포넌트로 route에 등록된 children을 렌더링한다.
- Wrapping Layout을 구현할 수 있다.
※ Outlet 컴포넌트(children)에 데이터를 전달할 수도 있다.
<Outlet context={ 전달할data } />
const ctx = useOutletContext();
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import HomePage from './pages/Home';
import ProductsPage from './pages/Products';
import RootLayout from './pages/Root';
import ErrorPage from './pages/Error';
const router = createBrowserRouter([
{
path: '/',
element: <RootLayout />,
children: [
{ path: '/', element: <HomePage /> },
{ path: '/products', element: <ProductsPage /> },
],
},
]);
function App() {
return <RouterProvider router={router} />;
}
export default App;
import React from 'react';
import { Outlet } from 'react-router-dom';
import MainNavigation from '../components/MainNavigation';
function RootLayout() {
return (
<>
<MainNavigation />
<main>
<Outlet />
</main>
</>
);
}
export default RootLayout;
import React from 'react';
import { Link } from 'react-router-dom';
import classes from './MainNavigation.module.css';
function MainNavigation() {
return (
<header className={classes.header}>
<nav>
<ul className={classes.list}>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/products">Products</Link>
</li>
</ul>
</nav>
</header>
);
}
export default MainNavigation;
// error 페이지
사이트 내의 잘못된 링크로 접속했을 때 뜨는 에러 창을 직접 만들 수 있다.
import { createBrowserRouter } from 'react-router-dom';
const router = createBrowserRouter([
{
path: '/경로',
element: jsx코드,
errorElement: jsx코드
}
]);
- errorElemnt property를 활용해 error 페이지를 렌더링할 수 있다.
import React from 'react';
import MainNavigation from '../components/MainNavigation';
function ErrorPage() {
return (
<>
<MainNavigation />
<main>
<h1>An error occurred!</h1>
<p>Could not find this page.</p>
</main>
</>
);
}
export default ErrorPage;
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import HomePage from './pages/Home';
import ProductsPage from './pages/Products';
import RootLayout from './pages/Root';
import ErrorPage from './pages/Error';
const router = createBrowserRouter([
{
path: '/',
element: <RootLayout />,
errorElement: <ErrorPage />,
children: [
{ path: '/', element: <HomePage /> },
{ path: '/products', element: <ProductsPage /> },
],
},
]);
function App() {
return <RouterProvider router={router} />;
}
export default App;
'클라이언트 > React' 카테고리의 다른 글
[리액트(React)] Router - loader (0) | 2024.02.19 |
---|---|
[리액트(React)] 동적 Route (0) | 2024.02.18 |
[리액트(React)] Redux Toolkit (0) | 2024.02.16 |
[리액트(React)] Redux with Class-based Component (0) | 2024.02.15 |
[리액트(React)] 리덕스(Redux) (0) | 2024.02.14 |