Next.js14从入门到实战009:NextJS基础篇之创建布局与页面

到目前为止,你的应用程序只有一个主页。让我们来学习如何通过布局和页面创建更多内容。

在本章主要学习

  • 使用文件系统路由创建 dashboard 路由。
  • 了解文件夹和文件在创建新航段时的作用。
  • 创建可在多个页面之间共享的嵌套布局。
  • 了解什么是主机托管、部分渲染和根布局。

嵌套路由

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

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

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

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

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

创建页面

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

JSX 复制代码
export default function Page() {
  return <p>Dashboard Page</p>;
}

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

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

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

练习下,创建一个页面

让我们练习下,创建两个页面

  1. 客户页面:该页面应可通过 http://localhost:3000/dashboard/customers 访问。它应返回一个 <p>Customers Page</p> 元素。
  2. 发票页面:发票页面应可在 http://localhost:3000/dashboard/invoices 上访问。还需返回 <p>Invoices Page</p> 元素。

如果你做完了,请看下答案

JSX 复制代码
// /app/dashboard/customers/page.tsx
export default function Page() {
  return <p>Customers Page</p>;
}
JSX 复制代码
// /app/dashboard/invoices/page.tsx
export default function Page() {
  return <p>Invoices Page</p>;
}

创建布局

在 Next.js 中,您可以使用一个特殊的 layout.tsx 文件来创建多个页面共享的用户界面。让我们为页面创建一个布局!

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

JSX 复制代码
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 /> 中,就像这样:

保存后,你看下页面是否如下:

在 Next.js 中使用布局的一个好处是,在导航时,只有页面组件会更新,而布局不会重新渲染。这就是所谓的部分呈现:

根布局

在之前的教程中,您将 Inter 字体导入了另一个布局: /app/layout.tsx 。在此提醒一下:

javascript 复制代码
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>
  );
}

这被称为根布局,是必需的。任何添加到根布局的用户界面都将在应用程序的所有页面中共享。您可以使用根布局来修改 <html><body> 标记,并添加元数据(有关元数据的更多信息,后面的章节会提到)。

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

相关推荐
wearegogog1235 小时前
基于 MATLAB 的卡尔曼滤波器实现,用于消除噪声并估算信号
前端·算法·matlab
Drawing stars5 小时前
JAVA后端 前端 大模型应用 学习路线
java·前端·学习
品克缤5 小时前
Element UI MessageBox 增加第三个按钮(DOM Hack 方案)
前端·javascript·vue.js
小二·5 小时前
Python Web 开发进阶实战:性能压测与调优 —— Locust + Prometheus + Grafana 构建高并发可观测系统
前端·python·prometheus
小沐°5 小时前
vue-设置不同环境的打包和运行
前端·javascript·vue.js
qq_419854056 小时前
CSS动效
前端·javascript·css
烛阴6 小时前
3D字体TextGeometry
前端·webgl·three.js
桜吹雪6 小时前
markstream-vue实战踩坑笔记
前端
C_心欲无痕7 小时前
nginx - 实现域名跳转的几种方式
运维·前端·nginx
花哥码天下7 小时前
恢复网站console.log的脚本
前端·javascript·vue.js