공부공부/Next.js 공식문서

[next.js 공식문서] 03. Pages and Layouts

고생쨩 2024. 2. 27. 08:23
728x90

next.js 13버전 때 학습내용 정리 문서로 현재와 다름 주의

Pages and Layouts

페이지

페이지는 경로에 고유한 UI

export default function Page() {
  return <h1>Hello, Next.js!</h1>;
}
  • 페이지는 항상 경로 하위 트리의 리프임.
  • .js, .jsx, .tsx 파일 확장자 사용가능
  • 경로 세그먼트에 공개적으로 액세스 하려면 page.js 필요
  • 페이지는 기본적으로 서버 컴포넌트지만 클라이언트 컴포넌트로 설정할 수 있음
  • 페이지는 데이터를 가져올 수 있음

레이아웃

레이아웃은 여러 페이지간에 공유되는 UI (리렌더링이 안되고 중첩가능)

export default function DashboardLayout({
  children, // will be a page or nested layout
}: {
  children: React.ReactNode,
}) {
  return (
    <section>
      {/* Include shared UI here e.g. a header or sidebar */}
      <nav></nav>

      {children}
    </section>
  );
}
  • 최상위 레이아웃을 루트 레이아웃이라 함. 루트레이아웃에는 html과 body 태그가 포함되어야함.
  • 모든 경로 세그먼트는 선택적으로 자체 레이아웃을 정의할 수 있음.
  • 경로의 레이아웃은 기본적으로 중첩됨
  • 경로 그룹을 사용하여 공유 레이아웃 내외부로 특정 경로 세그먼트를 설정할 수 있음.
  • 레이아웃은 서버 컴포넌트지만 클라이언트 컴포넌트로 설정할 수 있음
  • 레이아웃은 데이터를 가져올 수 있음
  • 상위 레이아웃과 해당 레이아웃간에 데이터 전달 불가능, but 경로에서 동일한 데이터를 두번 이상 가져오고 리액트는 요청을 자동으로 중복 제거함.
  • layout과 page는 같은 폴더에 정의할 수 있음.

루트 레이아웃(필수)

export default function RootLayout({ children }: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  );
}
  • app 디렉토리는 루트레이아웃을 포함해야함.
  • 루트 레이아웃은 next.js가 자동으로 생성하지 않기 때문에 html, body 태그를 정의해야함
  • 내장된 seo 지원을 사용하여 head, title 등을 관리할 수 있음
  • 경로 그룹을 사용하여 여러 루트 레이아웃을 만들 수 있음
  • 루트 레이아웃은 서버 컴포너트이며 클라이언트 구성요소로 설정할 수 없음

중첩 레이아웃

두 레이아웃을 결합하는 경우 루트 레이아웃은 하위 레이아웃을 래핑하고 하위 레이아웃 내부 경로 세그먼트를 래핑함.

템플릿

기본적으로 레이아웃과 같음.
다른 점은 템플릿을 공유하는 자식 사이를 이동할때 dom요소가 리렌더링됨.

  • css 또는 애니메이션 라이브러리를 쓸 때
  • useEffect나 useState에 의존하는 기능
  • 기본 프레임워크 동작을 변경

권장 : 왠만하면 레이아웃 써라.

export default function Template({ children }: {
  children: React.ReactNode
}) {
  return <div>{children}</div>;
}

<head> 수정

export const metadata = {
  title: 'Next.js'
};

export default function Page() {
  return '...'
}

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.