Files
rikako-note/react/next.js.md
2023-06-01 00:52:14 +08:00

3.1 KiB
Raw Blame History

next.js

Routing

创建路由

next.js使用基于文件系统的路由文件路径用于定于路由。
每一个文件夹都代表到一个匹配到URL segmentroute segment,为了创建嵌套路由,可以在文件夹中嵌套文件夹。

  • 例如app文件夹代表根URLapp/dashboard/settings则是代表/dashboard/settings
  • 而一个page.js文件则是让该route segment可以公共访问。

如果app/dashboard/路径下存在文件page.js则是代表该路径/dashboard可以被公共访问而另一个路径app/analytics下没有page.js文件则是代表该路径/analytics不能够被公共访问故而该路径可以被用于存储组件、样式表、图片和其他文件

创建UI

在位每一个route segment创建UI时会使用特殊的文件规范其中page会用于创建route UI而layout则是被用于创建被多个route所共享的UI。

pages和layouts

pages

page UI每个都唯一对应一个route。可以通过在page.js文件中导出组件来定义page UI定义page.js可以让该路径变得公共可访问。
创建page的示例如下

// app/page.tsx
export default function Page() {
  return <h1>Hello, Next.js!</h1>;
}

// `app/dashboard/page.tsx` is the UI for the `/dashboard` URL
export default function Page() {
  return <h1>Hello, Dashboard Page!</h1>;
}

pages使用须知

  • root layout被应用下所有page共享
  • 任意root segment可以选择定义自己的layout该layout会被在该segment下的所有page共享
  • route中的layout默认是嵌套的每个parent layout都会使用child prop来包含嵌套layout

layouts

layout UI在多个page UI之间被共享。在导航时layout会保留state保持交互并且不会被重新渲染。layout也可以嵌套。
可以通过在layout.js中导出一个默认react组件来定义一个layout该组件应该接受一个children prop并且在渲染时被注入一个child layout或child page。
创建layout示例如下

export default function DashboardLayout({
  children, // will be a page or nested layout
}) {
  return (
    <section>
      {/* Include shared UI here e.g. a header or sidebar */}
      <nav></nav>
 
      {children}
    </section>
  );
}

Root Layout(必须)

root layout在app目录下被定义并且应用于所有的route。该layout允许修改从server返回的初始html

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>{children}</body>
    </html>
  );
}

root layout使用需要满足如下条件

  • app目录下必须包含一个root layout
  • root layout必须要定义<html>标签和<body>标签next.js并不会自动创建它们
  • 如果layout.js存在多层嵌套例如/layout.js/about/layout.js,/about/asahi/layout.js都存在那么嵌套结构将是layout.js->about/layout.js->about/asahi/layout.js->about/asahi/page.js其中about/asahi/page.js渲染的效果将会包含上层所有的layout