3. Router
ReactRouter - RouterProvider
강의 정리
Router
React Router 버전 6.4부터 라우터 객체를 만들어서 쓰도록 지원한다.
React Router는 React의 공식 라이브러리는 아니다, 다른 Router 라이브러리를 사용할 수도 있다.
실제로 페이지가 많아지게 되면, App.tsx
가 상당히 비대해지는 경우가 있는데 라우터 객체를 활용하면 분리할 수 있다.
레이아웃을 잡으려면 Layout 컴포넌트를 만들고, 라우터 객체를 계층형으로 작성한다.
Outlet
컴포넌트는 라우터 객체의 element가 렌더링 되는 위치다.
import { Outlet } from 'react-router-dom';
function Layout() {
return (
<div>
<Header />
<Outlet />
<Footer />
</div>
);
}
const routes = [
{
element: <Layout />,
children: [
{ path: '/', element: <HomePage /> },
{ path: '/about', element: <AboutPage /> },
],
},
];
export default routes;
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import routes from './routes';
const router = createBrowserRouter(routes);
root.render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>,
);
라우터 객체를 만드는 방식으로 변경하면 테스트 코드에도 변경이 생긴다. 중복을 제거하기 위해서 테스트마다 path만 변경되기 때문에, path를 매개변수로 받는 renderRouter 함수를 하나 작성해서 사용한다.
describe('routes'', () => {
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(/Hello/);
});
});
context('when the current path is “/about”', () => {
it('renders the about page', () => {
renderRouter('/about');
screen.getByText(/About/);
});
});
});
Last updated