一.介绍
分页功能可将大型数据集划分为可管理的块,从而帮助管理它们。您可以在 Next.js 的服务器端或客户端实现分页。这里有一份精简的入门指南。
1. 服务器端分页
1.1 创建 API 路由
设置 API 路由来处理分页。
// pages/api/posts.js
export default async function handler(req, res) {const { page = 1, limit = 10 } = req.query;// 模拟数据const posts = Array.from({ length: 100 }, (_, i) => ({ id: i + 1, title: `Post ${i + 1}` }));const startIndex = (page - 1) limit;const paginatedPosts = posts.slice(startIndex, startIndex + limit);res.status(200).json({data: paginatedPosts,total: posts.length,page: parseInt(page),totalPages: Math.ceil(posts.length / limit),});
}
1.2 获取页面数据
使用 getServerSideProps 获取分页数据。
// pages/posts.js
import Link from 'next/link';const PostsPage = ({ data, page, totalPages }) => (<div><h1>Posts</h1><ul>{data.map(post => (<li key={post.id}>{post.title}</li>))}</ul><div>{page > 1 && (<Link href={`/posts?page=${page - 1}`}><a>Previous</a></Link>)}{page < totalPages && (<Link href={`/posts?page=${page + 1}`}><a>Next</a></Link>)}</div></div>
);export async function getServerSideProps(context) {const { query } = context;const page = parseInt(query.page) || 1;const res = await fetch(`http://localhost:3000/api/posts?page=${page}`);const { data, totalPages } = await res.json();return { props: { data, page, totalPages } };
}export default PostsPage;
2. 客户端分页
2.1 设置状态管理
使用状态来管理客户端的分页。
// components/Posts.js
import { useState, useEffect } from 'react';const Posts = ({ initialData, initialPage, totalPages }) => {const [posts, setPosts] = useState(initialData);const [page, setPage] = useState(initialPage);useEffect(() => {const fetchPosts = async () => {const res = await fetch(`/api/posts?page=${page}`);const { data } = await res.json();setPosts(data);};fetchPosts();}, [page]);return (<div><h1>Posts</h1><ul>{posts.map(post => (<li key={post.id}>{post.title}</li>))}</ul><div>{page > 1 && (<button onClick={() => setPage(page - 1)}>Previous</button>)}{page < totalPages && (<button onClick={() => setPage(page + 1)}>Next</button>)}</div></div>);
};export default Posts;
2.2 使用组件
在页面中集成客户端分页组件。
// pages/posts.js
import Posts from '../components/Posts';const PostsPage = ({ initialData, initialPage, totalPages }) => (<PostsinitialData={initialData}initialPage={initialPage}totalPages={totalPages}/>
);export async function getServerSideProps(context) {const { query } = context;const page = parseInt(query.page) || 1;const res = await fetch(`http://localhost:3000/api/posts?page=${page}`);const { data, totalPages } = await res.json();return {props: {initialData: data,initialPage: page,totalPages,},};
}export default PostsPage;
3.最佳实践
- 优化数据获取:仅加载必要的数据以避免性能问题。
- 用户体验:提供直观的导航和加载指示器。
- 错误处理:针对数据获取失败和边缘情况实现错误处理。
二.概括
Next.js 中的分页可以在服务器端或客户端处理。通过设置 API 路由并使用适当的数据获取技术,您可以有效地管理大型数据集并增强用户体验。遵循最佳实践,确保您的分页实现高效且用户友好。