개발자

Nextjs app router 사용시 multiple layout은 보통 어떻게 구성하시나요?

2023년 11월 13일조회 1,279

예를들어서 헤더와 사이드바가 있을 때 루트 레이아웃에 헤더와 사이드바를 구성해두면 다른 페이지에서 추가 작성하거나 관리할 필요가 없어서 편리할거 같긴합니다. 하지만 로그인 페이지나 회원가입 페이지에선 사이드바가 필요가 없는 상황일 경우 레이아웃 구성을 어떻게 하는게 좋을까요? 1. 루트 레이아웃엔 최소한의 구성만 하고 개별 페이지 레이아웃에 추가 구성을 한다. 2. 그외의 다른 방법 추천 부탁드립니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

인기 답변

백승훈님의 프로필 사진

해당 질문은 흔히 말하는 케바케인 경우가 많아서 여러가지 방법을 쓰며 정답이 있지는 않습니다. 다만 저와 같은 경우 Next.js를 사용 시 레이아웃 파일에 해더를 작성해 놓습니다. 이후 필요한 페이지에서는 해당 해더를 표시하고 필요하지 않을 경우 표시하지 않습니다. 혹은 해더 정보를 미리 라우트 단에서 처리해서 해더를 보여주거나 보여주지 않는 방식도 가능합니다. 마지막으로 HOC (고차 컴포넌트)를 활용하여 특정 페이지는 a해더, 특정 페이지는 b해더 특정 페이지는 해더없음 등으로 표시하는 방법도 가능합니다.

1// withHeader.js (HOC)
2import React from 'react';
3import Layout from './Layout';
4
5const withHeader = (WrappedComponent, showHeader = true) => {
6  return props => (
7    <Layout showHeader={showHeader}>
8      <WrappedComponent {...props} />
9    </Layout>
10  );
11};
12
13export default withHeader;
14
15// Layout.js
16const Layout = ({ children, showHeader }) => (
17  <>
18    {showHeader && <Header />} // 조건부 렌더링을 통해 헤더 표시
19    {children}
20  </>
21);
22
23// 사용 예시
24import withHeader from './withHeader';
25
26const HomePage = () => (
27  // 홈 페이지 컨텐츠
28);
29
30export default withHeader(HomePage, true); // 해더가 있는 페이지
31
32const AboutPage = () => (
33  // 소개 페이지 컨텐츠
34);
35
36export default withHeader(AboutPage, false); // 해더가 없는 페이지
profile picture

익명

작성자

2023년 11월 14일

감사합니다..프로 답변러..코드까지 첨부해주셔서 많은 도움이 됐습니다!

인기 답변

백승훈님의 프로필 사진

혹은 최근 저희 프로젝트에서 다른 분이 작성한 걸 본건데 이 방식도 유용해 보입니다. 이 방식을 사용하면, 페이지 설정을 한 곳에서 관리할 수 있고, 라우트 변경이나 새 페이지 추가 시 설정 파일만 업데이트하면 됩니다. 또한, 이런 구조는 애플리케이션의 라우팅과 관련된 설정을 명확하고 중앙집중적으로 관리할 수 있게 해, 큰 규모의 애플리케이션에서 특히 유용합니다. 간단하게 요약하기 위해 ChatGPT4의 코드를 가져왔습니다. 일부 부분은 수정하셔야 할 수도 있습니다.

1// 페이지 설정 파일 (pagesConfig.js)
2// 라우트와 관련된 설정을 담은 별도의 파일을 만듭니다. 이 파일은 각 페이지의 경로, 해더 표출 여부, 그리고 필요한 추가 메타데이터를 포함할 수 있습니다.
3
4// pagesConfig.js
5const pagesConfig = {
6  '/': {
7    showHeader: true,
8    title: '홈 페이지'
9  },
10  '/about': {
11    showHeader: false,
12    title: '소개 페이지'
13  },
14  // 추가 페이지 설정...
15};
16
17export default pagesConfig;
18
19// 레이아웃 컴포넌트 수정
20// 레이아웃 컴포넌트를 수정하여, 페이지 설정에 따라 해더의 표출 여부를 결정합니다.
21
22// components/Layout.js
23import React from 'react';
24import Header from './Header';
25import pagesConfig from '../pagesConfig';
26
27const Layout = ({ children, pathname }) => {
28  const currentPageConfig = pagesConfig[pathname];
29
30  return (
31    <div>
32      {currentPageConfig.showHeader && <Header />}
33      <main>{children}</main>
34    </div>
35  );
36};
37
38export default Layout;
39
40// _app.js 파일에서 설정 적용
41// Next.js의 커스텀 _app.js 파일에서 Layout 컴포넌트에 현재 페이지의 경로를 전달합니다.
42
43// pages/_app.js
44import Layout from '../components/Layout';
45import '../styles/globals.css';
46
47function MyApp({ Component, pageProps, router }) {
48  return (
49    <Layout pathname={router.pathname}>
50      <Component {...pageProps} />
51    </Layout>
52  );
53}
54
55export default MyApp;
profile picture

익명

작성자

2023년 11월 14일

감사합니다!!!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 11월 13일

Next.js에서 multiple layout을 구성하는 방법은 여러가지가 있습니다. 나열한 방법 외에도 다음과 같이 해볼 수 있습니다. 3. 각 페이지를 위한 고유한 Layout 컴포넌트 생성: 이 방법은 로그인 페이지나 회원가입 페이지와 같이 특정 레이아웃이 필요한 경우 유용합니다. 예를 들어, LoginLayout, SignupLayout 등과 같은 컴포넌트를 만들고 이 컴포넌트 내에서 헤더, 사이드바 등의 구성을 결정할 수 있습니다. 4. 조건부 레이아웃: 이는 `_app.js` 파일 내에 일반적인 레이아웃을 설정하되, 특정 조건(예: 현재 경로가 로그인 페이지 또는 회원가입 페이지일 경우 등)에 따라서 추가 구성 요소(예: 사이드바)를 제거하는 방식입니다. 5. Higher Order Component(HOC) 사용: HOC 기능을 활용해 각 페이지 별로 필요한 Layout Component를 Wrapping 합니다. 그렇게 하면 해당 페이지에서는 원하는 레이아웃만 나타낼 수 있습니다. 기본적으로 Next.js에서 어떤 방식으로 Layout을 구현하든 그것은 프로젝트의 필요성과 개발자의 선호에 따라 달라질 수 있습니다. 따라서 모든 방법들을 적절하게 조합하거나, 자신의 프로젝트에 가장 적합한 방식을 선택하는 것이 가장 좋습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!