Menu
CoddyTech

Halaman Tidak Ditemukan

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

Rute dinamis terlalu permisif. app/menu/[slug]/page.jsx cocok dengan /menu/pizza, dan juga cocok dengan /menu/asdfgh tanpa masalah, lalu merender halaman hidangan untuk hidangan yang tidak ada.

Next.js menyediakan kedua bagian solusi untukmu.

1. Layar 404. File bernama not-found.jsx, termasuk kelompok nama file khusus yang sama dengan page.jsx dan layout.jsx:

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

Letakkan di app/not-found.jsx dan halaman ini mencakup seluruh aplikasi: setiap URL yang tidak cocok dengan apa pun akan diarahkan ke sini, bukan ke halaman 404 bawaan yang sederhana.

2. Pemicu. Terkadang URL cocok dengan rute, tetapi datanya tidak ada. Itulah kasus /menu/asdfgh, dan hanya kodemu yang bisa mengetahuinya. Panggil 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() tidak mengembalikan nilai dan kamu tidak mengembalikannya: memanggilnya langsung menghentikan halaman di situ dan menampilkan not-found.jsx terdekat. Semua hal setelah if dapat menganggap dengan aman bahwa hidangan itu benar-benar ada, itulah sebabnya pemeriksaan ditempatkan di bagian atas.

challenge icon

Tantangan

Sedang

/menu/sushi saat ini menampilkan halaman hidangan untuk hidangan yang tidak ada di menu. Tutup celah ini.

  1. Lengkapi file app/not-found.jsx. Ekspor default sebuah komponen yang mengembalikan <h1> dengan id="not-found-title" dan teks persis Dish not found.
  2. Di app/menu/[slug]/page.jsx, impor notFound dari next/navigation.
  3. Jika slug tidak ada di array dishes, panggil notFound() sebelum merender apa pun.

/menu/pizza harus tetap berfungsi.

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