Menu
CoddyTech

Rute Dinamis

Termasuk bagian Dasar-Dasar Next.js dalam perjalanan React di Coddy. Pelajaran 8 dari 47.

Menu dengan empat puluh hidangan tidak memerlukan empat puluh folder. Kamu ingin /menu/pizza, /menu/pasta dan /menu/tiramisu menjadi halaman yang sama yang menampilkan data berbeda.

Itulah arti tanda kurung siku dalam nama folder:

app/
    menu/
        [slug]/
            page.jsx     ->  /menu/pizza
                         ->  /menu/pasta
                         ->  /menu/anything-at-all

Folder biasa cocok dengan namanya sendiri. Folder [bracketed] cocok dengan segmen apa pun dan mengingat bagian yang cocok. Kata di dalam tanda kurung siku adalah nama yang akan kamu gunakan untuk membaca kembali nilainya: [slug] memberimu slug, [id] memberimu id.

Selanjutnya, nilai itu diteruskan ke halaman sebagai prop bernama params:

// app/menu/[slug]/page.jsx
export default async function Dish({ params }) {
    const { slug } = await params;

    return <h1>{slug}</h1>;
}

Ada tiga hal yang terjadi di file kecil itu:

  • Halaman menerima prop params. Setiap halaman mendapatkannya, dan untuk rute dinamis, prop ini menyimpan segmen yang cocok.
  • params adalah Promise di Next 15, jadi kamu await nilainya. Itulah sebabnya komponen ini async. Bab 5 menjelaskan alasan halaman boleh menjadi seperti itu.
  • Destructuring mengambil slug, yang namanya berasal langsung dari folder [slug].

Kunjungi /menu/pasta dan slug bernilai "pasta". Satu file, setiap hidangan.

challenge icon

Tantangan

Mudah

Folder dinamisnya sudah tersedia: app/menu/[slug]/page.jsx menangani setiap URL di bawah /menu. Masalahnya, halaman itu selalu menampilkan pizza, apa pun hidangan yang kamu minta.

  1. Buat component-nya async.
  2. Baca segmen yang cocok dengan const { slug } = await params;.
  3. Tampilkan slug di dalam <h1 id="dish">, bukan teks yang ditulis langsung.

Pengujian mengunjungi dua hidangan berbeda dan mengharapkan dua heading yang berbeda.

Coba sendiri

import './globals.css';

export const metadata = {
    title: 'My App',
};

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body>
                {children}
            </body>
        </html>
    );
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Dasar-Dasar Next.js