Chapter 4:创建 Layouts 和 Pages

创建 Layouts 和 Pages

到目前为止,你的应用只有一个主页。让我们学习如何使用布局和页面创建更多路由。

以下是本章中将涵盖的主题:

  • 使用文件系统路由创建仪表板路由。
  • 了解在创建新路由段时文件夹和文件的作用。
  • 创建一个可以在多个仪表板页面之间共享的嵌套布局。
  • 了解放置同位置、部分渲染和根布局的作用。

嵌套路由

Next.js 使用文件系统路由,其中文件夹用于创建嵌套路由。每个文件夹代表一个路由段,对应到一个 URL 段。

图示展示了文件夹如何映射到 URL 段

你可以使用 layout.tsxpage.tsx 文件为每个路由创建单独的用户界面。

page.tsx 是 Next.js 的一个特殊文件,它导出一个 React 组件,让该路由可访问是必需的。在你的应用中,已经有一个页面文件:/app/page.tsx - 这是与路由 / 相关联的主页。

要创建嵌套路由,可以将文件夹嵌套在彼此之内,并在其中添加 page.tsx 文件。例如:

图示展示了如何添加名为 dashboard 的文件夹以创建新路由 '/dashboard'

/app/dashboard/page.tsx 与路径 /dashboard 相关联。让我们创建页面看看它是如何工作的!

创建 Dashboard 页面

/app 中创建一个名为 dashboard 的新文件夹。然后,在 dashboard 文件夹内创建一个名为 page.tsx 的新文件,其内容如下:

/app/dashboard/page.tsx
export default function Page() {
  return <p>Dashboard Page</p>;
}

现在,确保开发服务器正在运行,并访问 http://localhost:3000/dashboard (opens in a new tab)。 你应该看到 "Dashboard Page" 文本。

这就是在 Next.js 中创建不同页面的方式:使用文件夹创建新的路由段,并在其中添加一个 page 文件。

通过为页面文件使用特殊的名称,Next.js 允许你将 UI 组件、测试文件和其他相关代码与路由放置在一起。只有页面文件内部的内容才会被公开访问。例如,/ui/lib 文件夹与你的路由一起放置在 /app 文件夹中。

实践:创建仪表板页面

让我们练习创建更多的路由。在你的 dashboard 中,创建两个额外的页面:

花点时间解决这个练习,当你准备好时,展开下面的切换查看解决方案:

点击展开/折叠

Customers Page:

/app/dashboard/customers/page.tsx
export default function Page() {
  return <p>Customers Page</p>;
}

Invoices Page:

/app/dashboard/invoices/page.tsx
export default function Page() {
  return <p>Invoices Page</p>;
}

创建 dashboard 布局

dashboard 通常具有在多个页面之间共享的导航。在 Next.js 中,你可以使用一个特殊的 layout.tsx 文件来创建在多个页面之间共享的 UI。让我们为 dashboard 页面创建一个布局!

/dashboard 文件夹中,添加一个名为 layout.tsx 的新文件,并粘贴以下代码:

/app/dashboard/layout.tsx
import SideNav from '@/app/ui/dashboard/sidenav';
 
export default function Layout({ children }: { children: React.ReactNode }) {
  return (
    <div className="flex h-screen flex-col md:flex-row md:overflow-hidden">
      <div className="w-full flex-none md:w-64">
        <SideNav />
      </div>
      <div className="flex-grow p-6 md:overflow-y-auto md:p-12">{children}</div>
    </div>
  );
}

这段代码中发生了一些事情,让我们来详细解释一下:

首先,你将 <SideNav /> 组件导入到你的布局中。你导入到这个文件中的任何组件都将成为布局的一部分。

<Layout /> 组件接收一个 children 属性。这个子组件可以是一个页面或另一个布局。在你的情况下,位于 /dashboard 中的页面将自动嵌套在 <Layout /> 中,如下所示:

检查一切是否正确运行,保存你的更改并检查你的本地主机。你应该会看到以下内容:

在 Next.js 中使用布局的一个好处是,在导航时,只有页面组件会更新,而布局不会重新渲染。这被称为部分渲染 (opens in a new tab)

根布局(layout)

在第三章中,你将 Inter 字体引入到另一个布局中:/app/layout.tsx。作为提醒:

/app/layout.tsx
import '@/app/ui/global.css';
import { inter } from '@/app/ui/fonts';
 
export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en">
      <body className={`${inter.className} antialiased`}>{children}</body>
    </html>
  );
}

这被称为根布局,是必需的。你添加到根布局的任何 UI 将在应用程序中的所有页面之间共享。你可以使用根布局来修改 <html><body> 标签,添加元数据(关于元数据的更多内容将在后面的章节中学到)。

由于你刚刚创建的新布局(/app/dashboard/layout.tsx)专门用于 dashboard 页面,因此不需要在上述根布局中添加任何 UI。

是时候做个测验了!

Next.js 中 layout 文件的目的是什么?

声明

之前,有网友表示,这个项目挺好的,对他有帮助,来表示感谢!

在此声明下,本项目只是一个中文翻译版本,纯粹的 “为爱发电了”,原版权仍归 Next.js 官方教程所有,本翻译项目无任何商业行为,也不接受任何金钱上的捐赠哈。 如果真的感觉有帮助,就点个 Star 吧,关注下 “编程界” 公众号,上面平常也在分享 Next.js 相关内容。

扫码备注 “nextjs” 加入 Next.js 中文技术交流群

扫码备注「nextjs
加入 Next.js 中文技术交流群

关注公众号编程界获取最新 Next.js 开发资讯

关注公众号「编程界
获取最新 Next.js 开发资讯