最近基于 Next.js 写了几个项目,记录一下该框架的使用方法。
Next.js 是一个基于 React 的服务端渲染框架,支持 TypeScript。
本文主要记录 Next.js 的页面路由及页面数据获取。
页面路由
Next.js 的页面路由根据根目录下的 pages 文件夹的文件生成。即一个 page(页面) 就是一个从 .js、.jsx、.ts 或 .tsx 文件默认导出(export default)的 React 组件,每个 page(页面)都使用其文件名作为路由(route)。
例如:
如果你创建了一个命名为 pages/about.js 的文件并导出一个组件,则可以通过 /about 路径进行访问。
动态路由
如果你创建了一个命名为 pages/posts/[id].js 的文件,那么就可以通过 posts/1、posts/2 等类似的路径进行访问。
路由参数获取:
1 | import { useRouter } from 'next/router' |
query 对象除了有 param 的值,还有 query 请求对象的值。
以 /pages/post/[id].tsx 为例:
| router | query |
|---|---|
/post/1 |
{"id": "1"} |
/post/2?name=steven |
{"id": "2", "name": "steven"} |
如果 param 和 query 重名,param 将覆盖 query。
以 /pages/post/[id].tsx 为例:
| router | query |
|---|---|
/post/3?id=steven |
{"id": "3"} |
可以有多级动态路由。
以 /pages/post/[day]/[name].tsx 为例:
| router | query |
|---|---|
/post/2021-01-01/steven |
{"day": "2021-01-01", "name": "steven"} |
可以用 ... 匹配多级路由。
以 /pages/post/[...path].tsx 为例:
| router | query |
|---|---|
/post/a |
{"path": ["a"]} |
/post/b/1 |
{"path": ["b", "1"]} |
页面数据获取
Next.js 页面数据获取方法有两种,一是服务端数据获取,一是客户(网页)端异步获取。客户(网页)端异步获取方法和原生 React 框架的常用方法一样,但这种方式在数据爬取的时候往往只能获取页面框架代码,不利于 SEO,所以 Next.js 针对这个问题做了服务端数据获取(服务端渲染)。服务端数据获取的方法是调用 Next.js 暴露的 API,在客户端向前端服务器请求数据后,前端服务器在 Next.js 暴露的 API 对应的生命周期发送数据请求,获取后和网页代码一并返回给客户端。
服务端数据获取
Next.js 暴漏了三个 API 供服务端数据获取—— getStaticProps、getStaticPaths 和 getServerSideProps。
| API | 触发时间 | 用途 |
|---|---|---|
getStaticProps |
构建(build)时 | 在构建时固定,且后面不更改的数据。 |
getStaticPaths |
构建(build)时 | 用于动态路由页面,构建时固定,且后面不再更改,需要提供路由列表。 |
getServerSideProps |
向前端服务器请求数据后 | 根据路由数据向后端数据库请求数据。 |
getStaticProps
1 | import { GetStaticProps, InferGetServerSidePropsType } from 'next' |
getStaticPaths
1 | import { GetStaticProps, GetStaticPaths, InferGetServerSidePropsType } from "next"; |
getServerSideProps
1 | import { GetServerSideProps, InferGetServerSidePropsType } from 'next' //TypeScript:使用 GetServerSideProps |
客户(网页)端异步获取
1 | import {useEffect} from 'react'; |
表单 post 请求数据接收
这里再介绍一下表单 post 请求传递数据的方法,这种方法适用于将数据从一个页面发送给另一个页面,不经过后端处理。
当某一个页面向 /post 页面发送表单 post 请求时,下面可实现 /post 页面接收请求数据。
1 | // pages/api/request.ts |
1 | // pages/post/index.tsx |
参考资料