这篇Blog主要是记录我学习next.js的过程,以及一些重要的知识点。
Routing(路由, 以下内容都是app router)
Defining Routes(定义路由)
Next.js的路由是基于文件系统的, 只要在目录下有个page.(js|jsx|tsx)
文件,那么这个目录名就会成为一个可访问的路由地址。
Pages and Layouts(页面和布局)
Pages
page.(js|jsx|tsx)
文件可以让路由变成public access。默认情况下page.(js|jsx|tsx)
的组件都是server components
Layouts
Layout.(js|jsx|tsx)
文件可以做到让布局在多个路由中共享。Layout组件会接受一个Children
属性,这个属性就是当前路由的内容。
Root Layout(Required)
- 在
app
目录下必须要有一个layout.(js|jsx|tsx)
文件,这个文件是整个app的根布局。同时在该layout文件中,需要有html
和body
标签。 - 其他的嵌套
layout
文件不允许有html
和body
标签。 layout
默认是server components
。 没有办法在 parent layout 和 child layout 之间传递数据。
Templates
Template.(js|jsx|tsx)
文件和 Layout
文件的区别是在路由导航的时候, Template
实例会重新创建,而 layout 不会
Metadata
Metadata
可以通过在page.js
或者layout.js
导出metadata
对象来定义,或者通过generateMetadata
函数来动态生成。
Linking and Navigation
Link组件
这是主要并且推荐的一种路由跳转方式, 提供了prefetching
的功能
如果想要知道当前的路由可以通过usePathname
hook来获取
useRouter() hook
useRouter
hook 允许通过编程的方式在Client Components
进行路由跳转
redirect function
在 server components
中可以通过redirect
函数来进行路由跳转。不能在事件处理函数中使用redirect
函数。
Error Handling
Using Error Boundaries
通过添加error.tsx
文件可以处理子组件的错误, 当子组件发生错误的时候,error.tsx
会被渲染。
Handling Global Errors
在 app/global-error.tsx
文件中可以处理全局错误。注意需要有html
和body
标签。
Loading UI and Streaming
instant loading
loading.js
通过React Suspense
帮助创建一个有用的loading UI。当路由导航的时候,loading.js
会被渲染。
实际上loading.js
是一个包裹了page.js
的React Suspense
组件的fallback。