Menu
CoddyTech

Chờ tham số của tuyến

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 24 trên 47.

Đường dẫn động chuyển phần URL cho trang của bạn thông qua params. Trong Next 15 có một điểm cần ghi nhớ:

params là một promise.

// app/menu/[slug]/page.jsx
export default async function DishPage({ params }) {
    const { slug } = await params;
    // /menu/carbonara  ->  slug === 'carbonara'
}

Bỏ quên await cũng không gây lỗi, chính điều đó khiến lỗi này khó phát hiện. Giải cấu trúc một promise chỉ cho bạn undefined:

const { slug } = params;   // undefined
const dish = await getDish(slug);   // không tìm thấy gì

Trang vẫn hiển thị. Chỉ là trang trống hoặc toàn nội dung dự phòng, vậy mà bạn lại lục tìm lỗi trong lớp dữ liệu dù ở đó chẳng hề có lỗi.

Quy tắc tương tự cũng áp dụng cho searchParams. Cả hai đều là promise, cả hai đều cần được chờ bằng await và chỉ có trong các component máy chủ async, đây là thêm một lý do khiến trang bạn vừa viết phải là hàm bất đồng bộ.

Tại sao cần promise? Nhờ vậy, Next.js có thể bắt đầu hiển thị những phần trên trang không phụ thuộc vào URL trước khi xác định xong những phần có phụ thuộc vào URL.

challenge icon

Thử thách

Dễ

app/menu/[slug]/page.jsx gần đúng rồi, nhưng chưa bao giờ chờ params, nên món ăn nào cũng trả về Unknown dish.

  1. Chờ params trước khi phân rã: const { slug } = await params;

lib/data.js và trang chủ đã bị khóa. Truy cập /menu/carbonara phải hiển thị Carbonara trong #dish-name và giá của món đó trong #dish-price.

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