하나의 라우트에 해당하는 UI를 가진 파일
.js
, .jsx
, .tsx
여러 페이지간 공유되는 UI를 가진 파일
네비게이션 상에서 layouts은
만약 layout.js 파일에서 layout을 default로 export한 경우,
컴포넌트는 반드시 children
prop을 받아야 함.
→ 렌더링되는 동안 보여질 예정
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
를 포함해야함. (필수 컴포넌트)useSelectedLayoutSegment
나 useSelectedLayoutSegments
사용export default function RootLayout({ children }: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
html
과 body
를 생성해주지 않기 때문에, 반드시 root layout에 포함되어야 함html
과 body
를 포함한 폴더만의 root layout을 만들어 적용 가능_app.js
와 _document.js
를 layout
로 변경상위 레이아웃은 하위 레이아웃 및 파일들을 children props 를 통해 감싸게 됨.
하위 layout이나 page를 감싼다는 점에서 layout과 비슷
경로 전체에서 상태를 유지하는 layout과 달리 template은 각 하위 항목에 대해 새 인스턴스 생성
→ template을 공유하는 페이지간 이동시, 상태는 reset되고 effect는 재실행됨
→ 위 상황이 아니라면 layout 사용이 권장됨.
export를 default로 하는 경우, 중첩된 segment 전역에 적용
→ 그게 아니라면 self로 호출해야하나?
- self로 호출시, unique key를 넘겨주어야 함.
<Layout>
{/* Note that the template is given a unique key. */}
<Template key={routeParam}>{children}</Template>
</Layout>
<head>
metadata
객체나 generateMetadata
를 export해 layout
이나 page
에서 사용함으로써 적용 가능
import { Metadata } from 'next'
export const metadata: Metadata = {
title: 'Next.js',
}
export default function Page() {
return '...'
}
metadata를 <head>
에 수동으로 입력할 필요 없이 Metadata api를 사용해 <head>
요소의 스트리밍 및 중복 제거와 같은 고급 요구사항을 자동으로 처리