layout.js
layout
ファイルは、Next.jsアプリケーションでレイアウトを定義するために使用されます。
export default function DashboardLayout({
children,
}: {
children: React.ReactNode
}) {
return <section>{children}</section>
}
ルートレイアウトは、ルートapp
ディレクトリ内の最上位のレイアウトです。これは<html>
および<body>
タグと、その他のグローバルに共有されるUIを定義するために使用されます。
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
リファレンス
Props
children
(必須)
レイアウトコンポーネントはchildren
プロップを受け入れて使用する必要があります。レンダリング中、children
には、レイアウトがラップするルートセグメントが設定されます。これらは主に子Layout(存在する場合)またはPageのコンポーネントになりますが、適用可能な場合はLoadingやErrorのような他の特殊なファイルであることもあります。
params
(オプション)
ルートセグメントからそのレイアウトまでの動的ルートパラメータオブジェクトを含むオブジェクトに解決されるプロミス。
export default async function Layout({
params,
}: {
params: Promise<{ team: string }>
}) {
const { team } = await params
}
ルートの例 | 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
プロップはプロミスであるため、値にアクセスするにはasync/await
またはReactのuse
関数を使用する必要があります。- バージョン14以前では、
params
は同期プロップでした。下位互換性のため、Next.js 15でも同期的にアクセスできますが、この挙動は将来的に非推奨になります。
- バージョン14以前では、
ルートレイアウト
app
ディレクトリにはルートapp/layout.js
が**必須**です。
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html>
<body>{children}</body>
</html>
)
}
- ルートレイアウトは
<html>
および<body>
タグを**定義しなければなりません**。- ルートレイアウトに
<title>
や<meta>
のような<head>
タグを手動で追加**してはいけません**。Metadata APIを使用すべきです。これは、ストリーミングや<head>
要素の重複排除といった高度な要件を自動的に処理します。
- ルートレイアウトに
- 複数のルートレイアウトを作成するには、ルートグループを使用できます。
- **複数のルートレイアウト間**をナビゲートすると、**完全なページロード**が発生します(クライアントサイドのナビゲーションとは対照的に)。たとえば、
app/(shop)/layout.js
を使用する/cart
から、app/(marketing)/layout.js
を使用する/blog
へナビゲートすると、完全なページロードが発生します。これは**複数のルートレイアウトにのみ**適用されます。
- **複数のルートレイアウト間**をナビゲートすると、**完全なページロード**が発生します(クライアントサイドのナビゲーションとは対照的に)。たとえば、
注意点
レイアウトはsearchParams
を受け取らない
ページとは異なり、LayoutコンポーネントはsearchParams
プロップを**受け取りません**。これは、共有レイアウトがナビゲーション中に再レンダリングされないため、ナビゲーション間でsearchParams
が古くなる可能性があるためです。
クライアントサイドのナビゲーションを使用する場合、Next.jsは自動的に、2つのルート間の共通レイアウトの下にあるページ部分のみをレンダリングします。
たとえば、以下のディレクトリ構造では、dashboard/layout.tsx
は/dashboard/settings
と/dashboard/analytics
の両方にとって共通のレイアウトです。

/dashboard/settings
から/dashboard/analytics
へナビゲートする場合、/dashboard/analytics
内のpage.tsx
はサーバーで再レンダリングされますが、dashboard/layout.tsx
は両方のルート間で共有される共通UIであるため、再レンダリング**されません**。
このパフォーマンス最適化により、レイアウトを共有するページ間のナビゲーションが高速化されます。これは、独自のデータをフェッチする共有レイアウトを含む可能性のあるルート全体ではなく、データフェッチとレンダリングがページにのみ実行されるためです。
dashboard/layout.tsx
は再レンダリングされないため、レイアウトのServer Component内のsearchParams
プロップはナビゲーション後に**古くなる**可能性があります。
代わりに、レイアウト内のClient Componentで、ページのsearchParams
プロップまたはuseSearchParams
フックを使用してください。これらは、最新のsearchParams
でクライアントで再レンダリングされます。
レイアウトはpathname
にアクセスできない
レイアウトはpathname
にアクセスできません。これは、レイアウトがデフォルトでServer Componentであり、クライアントサイドのナビゲーション中に再レンダリングされないため、ナビゲーション間でpathname
が古くなる可能性があるためです。古くなるのを防ぐには、Next.jsはルートのすべてのセグメントを再フェッチする必要があり、キャッシュの利点を失い、ナビゲーション時のRSCペイロードサイズが増加します。
代わりに、pathname
に依存するロジックをClient Componentに抽出し、それをレイアウトにインポートできます。Client Componentはナビゲーション中に再レンダリングされる(ただし再フェッチはされない)ため、現在のpathname
にアクセスし、古くなるのを防ぐために、usePathname
などのNext.jsフックを使用できます。
import { ClientComponent } from '@/app/ui/ClientComponent'
export default function Layout({ children }: { children: React.ReactNode }) {
return (
<>
<ClientComponent />
{/* Other Layout UI */}
<main>{children}</main>
</>
)
}
一般的なpathname
パターンは、params
プロップでも実装できます。
詳細については、例のセクションを参照してください。
例
params
に基づいたコンテンツの表示
動的ルートセグメントを使用して、params
プロップに基づいて特定のコンテンツを表示またはフェッチできます。
export default async function DashboardLayout({
children,
params,
}: {
children: React.ReactNode
params: Promise<{ team: string }>
}) {
const { team } = await params
return (
<section>
<header>
<h1>Welcome to {team}'s Dashboard</h1>
</header>
<main>{children}</main>
</section>
)
}
クライアントコンポーネントでのparams
の読み取り
Client Component(async
にすることはできません)でparams
を使用するには、Reactのuse
関数を使用してプロミスを読み取ることができます。
'use client'
import { use } from 'react'
export default function Page({
params,
}: {
params: Promise<{ slug: string }>
}) {
const { slug } = use(params)
}
バージョン履歴
バージョン | 変更点 |
---|---|
v15.0.0-RC | params がプロミスになりました。コードモッドが利用可能です。 |
v13.0.0 | layout が導入されました。 |
この情報は役に立ちましたか?