Menu
CoddyTech

未找到页面

本课属于 Coddy React 学习旅程的“Next.js 基础”单元。第 9 课,共 47 课。

动态路由有时会宽容过头。app/menu/[slug]/page.jsx 会匹配 /menu/pizza,也会同样轻松地匹配 /menu/asdfgh,然后为一道不存在的菜渲染菜品页面。

Next.js 为你提供了这项修复的两个部分。

1. 404 页面。名为 not-found.jsx 的文件,和 page.jsx、layout.jsx 一样,属于特殊文件名阵营:

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

把它放在 app/not-found.jsx 中,它就会覆盖整个应用:所有没有匹配项的 URL 都会显示在这里,而不是显示默认的 404 页面。

2. 触发方式。有时,URL 与某个路由匹配,但数据不存在。这就是 /menu/asdfgh 这种情况,只有你的代码能判断。调用 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() 不会返回值,你也不会返回它:调用它会立即停止页面,并显示最近的 not-found.jsx。if 后面的所有代码都可以放心地假设这道菜确实存在,所以要把这个保护判断放在最前面。

challenge icon

挑战

中等

/menu/sushi目前会为一道不在菜单上的菜品渲染菜品页面。请修复这个漏洞。

  1. 完成文件 app/not-found.jsx。默认导出一个组件,该组件返回一个带有 id="not-found-title" 的 <h1>,其中的文本必须与 Dish not found 完全一致。
  2. 在 app/menu/[slug]/page.jsx 中,从 next/navigation 导入 notFound。
  3. 如果 slug 不在 dishes 数组中,请在渲染任何内容之前调用 notFound()。

/menu/pizza 必须仍然可以正常使用。

亲手试试

import './globals.css';

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

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body>
                {children}
            </body>
        </html>
    );
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

Next.js 基础中的所有课