layout.js
layout
ファイルは Next.js アプリケーションでレイアウトを定義するために使用されます。
ルートレイアウト はルート app
ディレクトリの最上位レイアウトです。<html>
タグや <body>
タグ、その他のグローバルに共有される UI を定義するために使用されます。
リファレンス
プロパティ
children
(必須)
レイアウトコンポーネントは children
プロパティを受け取り、使用する必要があります。レンダリング時、children
にはレイアウトがラップしているルートセグメントが含まれます。これには主に子の Layout(存在する場合)または Page のコンポーネントが含まれますが、状況によっては Loading や Error などの特別なファイルも含まれる場合があります。
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>
要素の重複排除などの高度な要件を自動的に処理する Metadata API を使用してください。
- ルートグループ を使用して複数のルートレイアウトを作成できます。
- 複数のルートレイアウト間を移動 すると、フルページロード が発生します(クライアントサイドナビゲーションとは異なります)。例えば、
app/(shop)/layout.js
を使用する/cart
からapp/(marketing)/layout.js
を使用する/blog
に移動すると、フルページロードが発生します。これは 複数のルートレイアウトの場合のみ 適用されます。
- 複数のルートレイアウト間を移動 すると、フルページロード が発生します(クライアントサイドナビゲーションとは異なります)。例えば、
注意点
リクエストオブジェクト
レイアウトはナビゲーション時にクライアント側でキャッシュされ、不要なサーバーリクエストを回避します。
レイアウト は再レンダリングされません。ページ間を移動する際に不要な計算を避けるためにキャッシュされ、再利用されます。レイアウトから生のリクエストにアクセスできないように制限することで、Next.js はレイアウト内でパフォーマンスに悪影響を与える可能性のある遅いまたは高コストなユーザーコードの実行を防ぎます。
リクエストオブジェクトにアクセスするには、Server Components および Functions で headers
と cookies
API を使用できます。
クエリパラメータ
レイアウトはナビゲーション時に再レンダリングされないため、古くなる可能性のある検索パラメータにアクセスできません。
更新されたクエリパラメータにアクセスするには、Page の searchParams
プロパティを使用するか、useSearchParams
フックを使用してクライアントコンポーネント内で読み取ります。クライアントコンポーネントはナビゲーション時に再レンダリングされるため、最新のクエリパラメータにアクセスできます。
パス名
レイアウトはナビゲーション時に再レンダリングされないため、古くなる可能性のあるパス名にアクセスできません。
現在のパス名にアクセスするには、クライアントコンポーネント内で usePathname
フックを使用して読み取ります。クライアントコンポーネントはナビゲーション時に再レンダリングされるため、最新のパス名にアクセスできます。
データの取得
レイアウトは children
にデータを渡すことができません。ただし、ルートで同じデータを複数回取得し、React の cache
を使用してリクエストを重複排除してもパフォーマンスに影響を与えません。
あるいは、Next.js で fetch
を使用すると、リクエストは自動的に重複排除されます。
子セグメントへのアクセス
レイアウトは自身より下のルートセグメントにアクセスできません。すべてのルートセグメントにアクセスするには、クライアントコンポーネントで useSelectedLayoutSegment
または useSelectedLayoutSegments
を使用できます。
例
メタデータ
metadata
オブジェクト または generateMetadata
関数 を使用して、title
や meta
などの <head>
HTML 要素を変更できます。
知っておくと良いこと: ルートレイアウトに
<title>
や<meta>
などの<head>
タグを手動で追加するべきではありません。代わりに、ストリーミングや<head>
要素の重複排除などの高度な要件を自動的に処理する Metadata API を使用してください。
アクティブなナビゲーションリンク
usePathname
フックを使用して、ナビゲーションリンクがアクティブかどうかを判断できます。
usePathname
はクライアントフックなので、ナビゲーションリンクをクライアントコンポーネントに抽出し、レイアウトにインポートする必要があります:
params
に基づくコンテンツの表示
ダイナミックルートセグメントを使用すると、params
プロップに基づいて特定のコンテンツを表示または取得できます。
クライアントコンポーネントでの params
の読み取り
クライアントコンポーネント(async
にできない)で params
を使用するには、React の use
関数を使用してプロミスを読み取ることができます:
バージョン履歴
バージョン | 変更内容 |
---|---|
v15.0.0-RC | params がプロミスになりました。コードモッドが利用可能です。 |
v13.0.0 | layout が導入されました。 |