Menu
CoddyTech

Trang không tìm thấy

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

Một tuyến đường động quá rộng rãi đến mức thành ra có vấn đề. app/menu/[slug]/page.jsx khớp với /menu/pizza, và cũng khớp với /menu/asdfgh dễ dàng như vậy, rồi hiển thị trang món ăn cho một món không tồn tại.

Next.js cung cấp cho bạn cả hai phần của giải pháp.

1. Màn hình 404. Một tệp có tên not-found.jsx, thuộc cùng nhóm tên tệp đặc biệt với page.jsx và layout.jsx:

// app/not-found.jsx
export default function NotFound() {
    return <h1>We don't have that</h1>;
}

Đặt tệp này tại app/not-found.jsx, và nó sẽ áp dụng cho toàn bộ ứng dụng: mọi URL không khớp với trang nào sẽ hiển thị trang này thay vì trang 404 mặc định.

2. Trường hợp kích hoạt. Đôi khi URL khớp với một tuyến đường nhưng dữ liệu lại không tồn tại. Đó là trường hợp /menu/asdfgh, và chỉ code của bạn mới có thể xác định điều đó. Gọi notFound():

import { notFound } from 'next/navigation';

const dishes = ['pizza', 'pasta'];

export default async function Dish({ params }) {
    const { slug } = await params;

    if (!dishes.includes(slug)) {
        notFound();
    }

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

notFound() không trả về giá trị và bạn cũng không trả về nó: gọi hàm này sẽ dừng trang ngay tại đó và hiển thị tệp not-found.jsx gần nhất. Mọi thứ sau if đều có thể mặc định rằng món ăn là có thật, đó là lý do câu lệnh kiểm tra được đặt ở đầu.

challenge icon

Thử thách

Trung bình

/menu/sushi hiện hiển thị trang món ăn cho một món không có trong thực đơn. Hãy khắc phục lỗ hổng này.

  1. Hoàn thiện tệp app/not-found.jsx. Xuất mặc định một thành phần trả về <h1> có id="not-found-title" và nội dung chính xác là Dish not found.
  2. Trong app/menu/[slug]/page.jsx, nhập notFound từ next/navigation.
  3. Nếu slug không có trong mảng dishes, hãy gọi notFound() trước khi hiển thị bất cứ thứ gì.

/menu/pizza vẫn phải hoạt động.

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