Menu
CoddyTech

Tuyến đường động

Thuộc phần Kiến thức thiết yếu về Next.js trong hành trình React của Coddy. Bài học 8 trên 47.

Một thực đơn có bốn mươi món không cần đến bốn mươi thư mục. Bạn muốn /menu/pizza, /menu/pasta và /menu/tiramisu là cùng một trang hiển thị dữ liệu khác nhau.

Đó là ý nghĩa của dấu ngoặc vuông trong tên thư mục:

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

Thư mục thông thường khớp với tên của chính nó. Thư mục [bracketed] khớp với bất kỳ phân đoạn nào và ghi nhớ phần đã khớp. Từ bên trong dấu ngoặc là tên bạn sẽ dùng để đọc lại giá trị đó: [slug] cho bạn slug, [id] cho bạn id.

Tiếp theo, truyền giá trị đó vào trang dưới dạng một prop có tên là params:

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

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

Có ba việc xảy ra trong tệp nhỏ đó:

  • Trang nhận một prop params. Mỗi trang đều có một prop, và với tuyến đường động, prop này chứa các phân đoạn khớp.
  • Trong Next 15, params là một Promise, nên bạn await nó. Vì vậy thành phần này là async. Chương 5 giải thích vì sao các trang được phép là như vậy.
  • Phép phân rã lấy ra slug, tên này bắt nguồn trực tiếp từ thư mục [slug].

Truy cập /menu/pasta và slug là "pasta". Một tệp, mọi món ăn.

challenge icon

Thử thách

Dễ

Thư mục động đã có sẵn: app/menu/[slug]/page.jsx xử lý mọi URL bên dưới /menu. Vấn đề là trang luôn hiển thị pizza, bất kể bạn yêu cầu món nào.

  1. Đặt component thành async.
  2. Đọc phân đoạn khớp với const { slug } = await params;.
  3. Hiển thị slug bên trong <h1 id="dish"> thay cho văn bản cố định.

Các bài kiểm tra truy cập hai món ăn khác nhau và mong đợi hai tiêu đề khác nhau.

Tự làm thử

import './globals.css';

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

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body>
                {children}
            </body>
        </html>
    );
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức thiết yếu về Next.js