Layouts と Templates
特別なファイルであるlayout.jsとtemplate.jsを使用すると、ルート間で共通のUIを作成できます。このページでは、これらの特別なファイルをいつ、どのように使用するかについて説明します。
Layouts
レイアウトは、複数のルート間で共有されるUIです。ナビゲーション時、レイアウトは状態を保持し、インタラクティブに保たれ、再レンダリングされません。レイアウトはネストすることもできます。
layout.js
ファイルからReactコンポーネントをデフォルトエクスポートすることで、レイアウトを定義できます。このコンポーネントは、child
レイアウト(存在する場合)やページで満たされるchildren
propを受け取る必要があります。
たとえば、このレイアウトは/dashboard
および/dashboard/settings
ページと共有されます:
- TypeScript
- JavaScript
app/dashboard/layout.tsx
export default function DashboardLayout({
children, // ページまたはネストされたレイアウトになります
}: {
children: React.ReactNode
}) {
return (
<section>
{/* ここに共有UIを含めます。例として、ヘッダーやサイドバーがあります */}
<nav></nav>
{children}
</section>
)
}
app/dashboard/layout.js
export default function DashboardLayout({
children, // ページまたはネストされたレイアウトになります
}) {
return (
<section>
{/* ここに共有UIを含めます。例として、ヘッダーやサイドバーがあります */}
<nav></nav>
{children}
</section>
)
}
Root レイアウト(必須)
Root レイアウトはapp
ディレクトリのトップレベルで定義され、すべてのルートに適用されます。このレイアウトは必須であり、html
とbody
タグを含む必要があります。これにより、サーバーから返される初期HTMLを変更できます。
- TypeScript
- JavaScript
app/layout.tsx
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>
{/* レイアウトUI */}
<main>{children}</main>
</body>
</html>
)
}
app/layout.js
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
{/* レイアウトUI */}
<main>{children}</main>
</body>
</html>
)
}
ネストされたレイアウト
デフォルトでは、フォルダ階層内のレイアウトはネストされており、children
propを介して子レイアウトをラップします。特定のルートセグメント(フォルダ)内にlayout.js
を追加することでレイアウトをネストできます。
たとえば、/dashboard
ルート用のレイアウトを作成するには、dashboard
フォルダ内に新しいlayout.js
ファイルを追加します:
- TypeScript
- JavaScript
app/dashboard/layout.tsx
export default function DashboardLayout({
children,
}: {
children: React.ReactNode
}) {
return <section>{children}</section>
}