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

71 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# next.js
## Routing
### 创建路由
next.js使用基于文件系统的路由文件路径用于定于路由。
每一个文件夹都代表到一个匹配到`URL segment``route segment`,为了创建嵌套路由,可以在文件夹中嵌套文件夹。
- 例如app文件夹代表根URL`app/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的示例如下
```tsx
// 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示例如下
```js
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
```js
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