Nicht-gefunden-Seiten
Teil des Abschnitts Next.js Essentials der React-Journey von Coddy. Lektion 9 von 47.
Eine dynamische Route ist geradezu übermäßig großzügig. app/menu/[slug]/page.jsx entspricht /menu/pizza und genauso bereitwillig /menu/asdfgh und rendert dann eine Gerichtseite für ein Gericht, das nicht existiert.
Next.js bietet dir beide Hälften der Lösung.
1. Der 404-Bildschirm. Eine Datei namens not-found.jsx, derselben Gruppe spezieller Dateinamen wie page.jsx und layout.jsx zugehörig:
// app/not-found.jsx
export default function NotFound() {
return <h1>We don't have that</h1>;
}Lege sie unter app/not-found.jsx ab; sie gilt für die gesamte app: Jede URL, die auf nichts passt, landet hier statt auf der einfachen integrierten 404-Seite.
2. Der Auslöser. Manchmal stimmt die URL mit einer Route überein, aber die Daten existieren nicht. Das ist der Fall /menu/asdfgh, und nur dein Code kann das feststellen. Rufe notFound() auf:
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() gibt keinen Wert zurück, und du gibst es nicht zurück: Sein Aufruf stoppt die Seite genau dort und zeigt die nächstgelegene not-found.jsx an. Alles nach dem if kann sicher davon ausgehen, dass das Gericht tatsächlich existiert – deshalb steht die Prüfung ganz oben.
Aufgabe
Mittel/menu/sushi rendert derzeit eine Gerichtseite für ein Gericht, das nicht auf der Speisekarte steht. Schließe diese Lücke.
- Vervollständige die Datei
app/not-found.jsx. Exportiere standardmäßig eine Komponente, die ein<h1>mitid="not-found-title"und dem exakten TextDish not foundzurückgibt. - Importiere in
app/menu/[slug]/page.jsxnotFoundausnext/navigation. - Wenn
slugnicht im Arraydishesenthalten ist, rufenotFound()auf, bevor irgendetwas gerendert wird.
/menu/pizza muss weiterhin funktionieren.
Probier es selbst
import './globals.css';
export const metadata = {
title: 'My App',
};
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
{children}
</body>
</html>
);
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Next.js Essentials
4Server & Client
Zwei Arten von KomponentenDen Fehler lesenDie 'use client'-ZeileClient-Teile klein haltenServer innerhalb von ClientZusammenfassung: Server & Client7Client-seitige Navigation
Der aktive LinkProgrammatisches RoutingFiltern mit der URLRoute-HandlerZusammenfassung: Navigation2Routing & Links
Ordner sind RoutenVerschachtelte RoutenSeiten verlinkenDynamische RoutenNicht-gefunden-SeitenZusammenfassung: Routing