Cara membuat catch all route Next.js adalah membuat folder bernama […slug] di dalam app, lalu menambahkan page.tsx di dalamnya. Semua segmen setelah folder induk masuk ke params.slug sebagai array. Pola ini cocok untuk dokumentasi, kategori bertingkat, atau halaman CMS.
Buat Folder […slug] untuk Cara Membuat Catch All Route Next Js
Struktur paling umum adalah app/docs/[...slug]/page.tsx. URL /docs/a/b/c menghasilkan slug: ["a", "b", "c"]. Satu file menangani kedalaman URL berapa pun.
- [id]: hanya satu segmen, contoh
/docs/intro. - […slug]: satu segmen atau lebih, contoh
/docs/a/b. URL induk/docstidak cocok. - [[…slug]]: nol segmen atau lebih, jadi
/docsdan/docs/a/bsama-sama cocok.
Langkah Membuat Catch All Route di App Router
Kesalahan yang sering terjadi adalah membaca params sebagai objek biasa di Next.js terbaru. Di App Router, params berupa Promise sehingga perlu await.
- Buat folder
app/docs/[...slug]. - Tambah file
page.tsxdi dalam folder tersebut. - Baca
paramsdenganawait, lalu gunakan array slug. - Render daftar segmen, breadcrumb, atau konten berdasarkan slug.
type Props = {
params: Promise<{ slug: string[] }>;
};
export default async function DocsPage({ params }: Props) {
const { slug } = await params;
const path = slug.join("/");
return (
<main>
<h1>Dokumen: {path}</h1>
<p>Jumlah segmen: {slug.length}</p>
</main>
);
}
params.slugselalu array pada catch all route.- Gunakan
slug.join("/")untuk path lengkap atau key konten CMS. - Gunakan
slug.mapuntuk membuat breadcrumb bertingkat.
Tabel Perilaku Route Dinamis App Router
Rute /docs tanpa segmen hanya cocok dengan optional catch all. Panggil notFound() dari next/navigation apabila kombinasi segmen tidak ada di database atau CMS.
| Pola | URL Cocok | Catatan |
|---|---|---|
| [id] | /docs/intro | Satu segmen saja |
| […slug] | /docs/a/b | Minimal satu segmen |
| [[…slug]] | /docs | Boleh tanpa segmen |
FAQ
Apakah catch all route bisa digabung route statis?
Bisa. Route statis seperti /docs/bantuan diprioritaskan sebelum [...slug].
Kapan memakai optional catch all [[…slug]]?
Pakai saat halaman induk dan halaman bertingkat memakai file yang sama, misalnya /docs dan /docs/a/b.
Bagaimana membaca catch all route di Client Component?
Gunakan useParams() dari next/navigation, lalu baca params.slug sebagai array string.