Parallel Routes
Parallel Routesを使用すると、同じレイアウト内で1つまたは複数のページを同時または条件に応じてレンダリングすることができます。これらは、ダッシュボードやソーシャルサイトのフィードなど、アプリの非常に動的なセクションに役立ちます。
たとえば、ダッシュボードを考えると、parallel routesを使用してteam
とanalytics
のページを同時にレンダリングできます:
スロット
Parallel routesは、名前付きスロットを使用して作成されます。スロットは、@folder
の規約で定義されます。たとえば、次のファイル構造では@analytics
と@team
という2つのスロットが定義されています:
スロットは共有親レイアウトにpropsとして渡されます。上記の例では、コンポーネントapp/layout.js
は現在@analytics
と@team
のスロットpropsを受け取り、children
propと並行してレンダリングできます:
- TypeScript
- JavaScript
export default function Layout({
children,
team,
analytics,
}: {
children: React.ReactNode
analytics: React.ReactNode
team: React.ReactNode
}) {
return (
<>
{children}
{team}
{analytics}
</>
)
}
export default function Layout({ children, team, analytics }) {
return (
<>
{children}
{team}
{analytics}
</>
)
}
ただし、スロットはroute segmentsではなく、URL構造に影響を与えません。たとえば、/@analytics/views
の場合、URLは@analytics
がスロットであるため/views
になります。スロットは通常のPageコンポーネントと組み合わされて、route segmentに関連付けられた最終ページが形成されます。このため、同じroute segmentレベルでstaticなスロットとdynamicなスロットを別々に持つことはできません。1つのスロットが動的である場合、そのレベルのすべてのスロットも動的である必要があります。
Good to know:
children
propは暗黙のスロットであり、フォルダーにマッピングする必要はありません。これはapp/page.js
がapp/@children/page.js
と等価であることを意味します。
ア クティブステートとナビゲーション
デフォルトでは、Next.jsは各スロットのアクティブステート(またはサブページ)を追跡します。ただし、スロット内でレンダリングされるコンテンツはナビゲーションの種類によります:
- ソフトナビゲーション: クライアントサイドナビゲーション中、Next.jsは部分的レンダリングを行い、スロット内のサブページを変更し、他のスロットのアクティブなサブページは保持されます。たとえそれらが現在のURLに一致しなくてもです。
- ハードナビゲーション: フルページが読み込まれた後(ブラウザのリフレッシュ)、Next.jsは現在のURLに一致しないスロットのアクティブステートを判断できません。その代わりに、
default.js
ファイルを一致しないスロットのためにレンダリングします。default.js
が存在しない場合は、404
がレンダリングされます。
Good to know:
- 一致しないルートのための
404
は、意図しないページにparallel routeをレンダリングしないことを保証するのに役立ちます。