Tabs using Parallel Routes with Next.js App Router
378 words
2min read
次のようなディレクトリ構造を例にする。
app├── layout.tsx├── page.tsx└── @tab ├── page.tsx └── new └── page.tsx
App Router では、@
から始まるディレクトリのページを上位のlayout.tsx
で受け取れる。
export default Layout({ children, tab }){ return ( <div> <nav> <Link href="/">Home Tab</Link> <Link href="/new">New Tab</Link> </nav> <div> {children} {tab} </div> </div> );}
これだけで、パスに応じてtab
が切り替わる。ただし、これだと/news
にアクセスした状態でリロードすると 404 が表示される。
Parallel Routes にリロード耐性を付ける
なぜ 404 が表示されるかというと、/new
に対応するapp/new/page.tsx
が存在しないからである。Parallel routes では、1 つでも対応していないルートが存在すると 404 になる。
app/default.tsx
を配置することで、これを回避できる。
default.tsx
は、ハードナビゲーション時に対応するルートがない場合のフォールバックを提供する。
https://nextjs.org/docs/app/api-reference/file-conventions/default
これは逆のパターンでも発生する。例えばapp/about/page.tsx
が存在する場合、app/@tab/about/page.tsx
が存在しないため、/about
にアクセスすると 404 が表示される。この場合、app/@tab/default.tsx
を配置することで回避できる。
Parallel Routes を扱うときはdefault.tsx
が大事
つまり、次のようなディレクトリ構造にしておくことで、アプリが拡張されていく中で意図せず 404 が表示されたり、リロード耐性が失われることを避けることができる。
app├── layout.tsx├── page.tsx├── default.tsx└── @tab ├── page.tsx ├── default.tsx └── new └── page.tsx