layout.js
layout
ファイルは、Next.jsアプリケーションでレイアウトを定義するために使用されます。
ルートレイアウトは、ルートのapp
ディレクトリにある最上位のレイアウトです。<html>
タグと<body>
タグ、およびその他のグローバルに共有されるUIを定義するために使用されます。
リファレンス
プロップ
children
(必須)
レイアウトコンポーネントはchildren
プロップを受け取り、使用する必要があります。レンダリング時、children
にはレイアウトがラップするルートセグメントが設定されます。これは主に子のレイアウト(存在する場合)またはページのコンポーネントになりますが、該当する場合はローディングやエラーなどの特殊なファイルも含まれます。
params
(オプション)
ルートセグメントからそのレイアウトまでの動的ルートパラメーターオブジェクトを含むPromiseです。
例示ルート | URL | params |
---|---|---|
app/dashboard/[team]/layout.js | /dashboard/1 | Promise<{ team: '1' }> |
app/shop/[tag]/[item]/layout.js | /shop/1/2 | Promise<{ tag: '1', item: '2' }> |
app/blog/[...slug]/layout.js | /blog/1/2 | Promise<{ slug: ['1', '2'] }> |
params
プロップはPromiseであるため、値にアクセスするにはasync/await
またはReactのuse
関数を使用する必要があります。- バージョン14以前では、
params
は同期的なプロップでした。下位互換性のため、Next.js 15では引き続き同期的にアクセスできますが、この動作は将来非推奨になります。
- バージョン14以前では、
ルートレイアウト
app
ディレクトリには、ルートのapp/layout.js
を必ず含める必要があります。
- ルートレイアウトは
<html>
タグと<body>
タグを必ず定義する必要があります。- ルートレイアウトに
<title>
や<meta>
などの<head>
タグを手動で追加しないでください。代わりに、ストリーミングや<head>
要素の重複排除などの高度な要件を自動的に処理するメタデータ APIを使用してください。
- ルートレイアウトに
- ルートグループを使用して、複数のルートレイアウトを作成できます。
- 複数のルートレイアウト間を移動すると、フルページ読み込みが発生します(クライアントサイドのナビゲーションとは異なります)。例えば、
app/(shop)/layout.js
を使用する/cart
からapp/(marketing)/layout.js
を使用する/blog
に移動すると、フルページ読み込みが発生します。これは複数のルートレイアウトにのみ適用されます。
- 複数のルートレイアウト間を移動すると、フルページ読み込みが発生します(クライアントサイドのナビゲーションとは異なります)。例えば、
注意事項
レイアウトはsearchParams
を受け取りません
ページとは異なり、レイアウトコンポーネントはsearchParams
プロップを受け取りません。これは、共有レイアウトがナビゲーション中に再レンダリングされないため、ナビゲーション間でsearchParams
が古くなる可能性があるからです。
クライアントサイドのナビゲーション中、Next.jsは自動的に2つのルート間の共通レイアウトの下の部分のみをレンダリングします。
例えば、次のディレクトリ構造では、dashboard/layout.tsx
は/dashboard/settings
と/dashboard/analytics
の共通レイアウトです:
/dashboard/settings
から/dashboard/analytics
にナビゲーションする際、/dashboard/analytics
のpage.tsx
はサーバー上で再レンダリングされますが、dashboard/layout.tsx
は2つのルートで共有される共通UIであるため、再レンダリングされません。
このパフォーマンス最適化により、共通レイアウトを共有するページ間のナビゲーションが高速になります。データフェッチとページのレンダリングのみが実行され、独自のデータをフェッチする可能性のある共有レイアウトを含むルート全体を実行する必要がありません。
dashboard/layout.tsx
は再レンダリングされないため、レイアウトのサーバーコンポーネントのsearchParams
プロップはナビゲーション後に古くなる可能性があります。
代わりに、レイアウト内のクライアントコンポーネントで、ページのsearchParams
プロップまたはuseSearchParams
フックを使用してください。これらはクライアント上で最新のsearchParams
と共に再レンダリングされます。
レイアウトはpathname
にアクセスできません
レイアウトはpathname
にアクセスできません。これは、レイアウトがデフォルトでサーバーコンポーネントであり、クライアントサイドのナビゲーション中に再レンダリングされないため、ナビゲーション間でpathname
が古くなる可能性があるためです。陳腐化を防ぐには、Next.jsはルートのすべてのセグメントを再フェッチする必要があり、キャッシュの利点を失い、ナビゲーション時のRSCペイロードサイズが増加します。
代わりに、pathnameに依存するロジックをクライアントコンポーネントに抽出し、それをレイアウトにインポートできます。クライアントコンポーネントはナビゲーション中に再レンダリングされる(ただし再フェッチはされない)ため、Next.jsのusePathname
などのフックを使用して現在のpathnameにアクセスし、陳腐化を防ぐことができます。
一般的なpathname
パターンは、params
プロップを使用して実装することもできます。
詳細については、例のセクションを参照してください。
例
params
に基づいたコンテンツの表示
動的ルートセグメントを使用することで、params
プロップに基づいて特定のコンテンツを表示またはフェッチできます。
クライアントコンポーネントでの params
の読み取り
(async
ではない)クライアントコンポーネントで params
を使用するには、Reactのuse
関数を使用してプロミスを読み取ることができます:
バージョン履歴
バージョン | 変更点 |
---|---|
v15.0.0-RC | params が現在プロミスです。コードモッドが利用可能です。 |
v13.0.0 | layout が導入されました。 |