创建布局和页面 5个月前

前端开发
657
创建布局和页面

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

在本章中

我们将涵盖以下内容:

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

嵌套路由

Next.js 使用文件系统路由,其中 文件夹(folders) 用于创建嵌套路由。每个文件夹代表一个 **路由段(route segment)**,并映射到一个 **URL段(URL segment)**。

image

您可以使用 layout.tsxpage.tsx 文件为每个路由创建单独的 UI。

page.tsx 是 Next.js 的一个特殊文件,它导出一个 React 组件,并且是路由可访问所必需的。在您的应用程序中,您已经有一个页面文件:/app/page.tsx,它是与路径 / 关联的主页。

要创建嵌套路由,您可以将文件夹嵌套在一起,并在其中添加 page.tsx 文件。例如:

image

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

创建仪表板页面

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

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

现在,确保开发服务器正在运行,并访问 http://localhost:3000/dashboard。您应该会看到 "Dashboard Page" 文本。

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

通过为 page 文件设置特殊名称,Next.js 允许您将 UI 组件、测试文件和其他相关代码 同置(colocate) 在您的路由旁边。只有 page 文件中的内容是公开可访问的。例如,/ui/lib 文件夹与您的路由一起 同置/app 文件夹内。

练习:创建仪表板页面

让我们练习创建更多的路由。在您的仪表板中,创建另外两个页面:

  1. 客户页面:页面应该可以在 http://localhost:3000/dashboard/customers 访问。暂时只返回 <p>Customers Page</p> 元素。
  2. 发票页面:发票页面应该可以在 http://localhost:3000/dashboard/invoices 访问。暂时也只返回 <p>Invoices Page</p> 元素。

花点时间完成这个练习,当您准备好时,下面查看解决方案:

解决方案 你的文件结构应该为如下图 image

客户页面(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>;
}

创建仪表板布局

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

/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 prop。这个子组件可以是页面或另一个布局。在您的情况下,/dashboard 文件夹中的页面将自动嵌套在 <Layout /> 中,如下所示:

image

保存您的更改并检查您的 localhost 以确保一切正常。您应该会看到以下内容:

image

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

image

根布局

第3章中,您将 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>
  );
}

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

由于您刚刚创建的新布局(/app/dashboard/layout.tsx)是仪表板页面独有的,因此您无需在上述根布局中添加任何 UI。

是时候做一个测验了!

测试您的知识,看看您刚刚学到了什么。

Next.js 中布局文件的作用是什么?

A. 作为全局错误处理器 B. 在整个应用程序中获取数据和管理状态 C. 在多个页面之间共享 UI D. 作为整个应用程序的入口点

检查答案

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2243613
累计阅读

热门教程文档

Flutter
105小节
Rust
84小节
Redis
14小节
MySQL
34小节
C#
57小节