반복되는 컴포넌트를 하나의 Layout으로 분리할 때, 각 페이지를 Layout 컴포넌트로 감싼다
위 방법은 Layout은 바뀌지 않는데도 mount, unmount가 될 수 있다는 문제점이 있다.
예시 코드
// DefaultLayout.jsx
function DefaultLayout() {
return (
<div>
{children}
<Link to="/">홈 페이지</Link>
<br />
<Link to="/posts">포스트 목록 페이지</Link>
<br />
<Link to="/posts/123">포스트 상세 페이지</Link>
</div>
);
}
export default DefaultLayout;
//Homepage.jsx
function Homepage() {
return (
<DefaultLatyout>
<h1>Homepage</h1>
</DefaultLatyout>
);
}
export default Homepage
//PostListPage.jsx
function PostListPage() {
return (
<DefaultLatyout>
<h1>PostListPage</h1>
</DefaultLatyout>
);
}
export default PostListPage
불필요한 mount, unmount를 해결하기 위한 방법이 라우터에 적용되어 있으므로 라우터에 Layout을 사용한다.
주의사항
{children}
대신 <Outlet/>
을 사용한다.예시 코드
//DefaultLayout.jsx
function DefaultLayout() {
return (
<div>
<Outlet />
<Link to="/">홈 페이지</Link>
<br />
<Link to="/posts">포스트 목록 페이지</Link>
<br />
<Link to="/posts/123">포스트 상세 페이지</Link>
</div>
);
}
//router.jsx
const router = createBrowserRouter([
{
element: <DefaultLayout />,
children: [
{
path: "/",
element: <Homepage />,
},
{
path: "/posts",
element: <PostsListPage />,
},
],
},
]);
export default router;