react 分页实现
分页组件实现
使用React实现分页功能通常需要结合状态管理、数据请求和UI渲染。以下是两种常见的实现方式:
基础分页组件
import { useState } from 'react';
function Pagination({ totalItems, itemsPerPage, onPageChange }) {
const [currentPage, setCurrentPage] = useState(1);
const totalPages = Math.ceil(totalItems / itemsPerPage);
const handleClick = (page) => {
setCurrentPage(page);
onPageChange(page);
};
return (
<div className="pagination">
<button
disabled={currentPage === 1}
onClick={() => handleClick(currentPage - 1)}
>
Previous
</button>
{Array.from({ length: totalPages }, (_, i) => i + 1).map(page => (
<button
key={page}
onClick={() => handleClick(page)}
className={currentPage === page ? 'active' : ''}
>
{page}
</button>
))}
<button
disabled={currentPage === totalPages}
onClick={() => handleClick(currentPage + 1)}
>
Next
</button>
</div>
);
}
API数据分页集成
与后端API集成时,通常需要处理分页参数和响应数据:
import { useState, useEffect } from 'react';
import axios from 'axios';
function DataList() {
const [data, setData] = useState([]);
const [currentPage, setCurrentPage] = useState(1);
const [totalPages, setTotalPages] = useState(0);
const itemsPerPage = 10;
useEffect(() => {
const fetchData = async () => {
const response = await axios.get(`/api/items?page=${currentPage}&limit=${itemsPerPage}`);
setData(response.data.items);
setTotalPages(response.data.totalPages);
};
fetchData();
}, [currentPage]);
return (
<div>
{/* 渲染数据列表 */}
<Pagination
currentPage={currentPage}
totalPages={totalPages}
onPageChange={setCurrentPage}
/>
</div>
);
}
高级分页功能
对于更复杂的分页需求,可以考虑以下增强功能:

页码范围优化
const getPageNumbers = () => {
const maxVisiblePages = 5;
let startPage = Math.max(1, currentPage - Math.floor(maxVisiblePages / 2));
let endPage = startPage + maxVisiblePages - 1;
if (endPage > totalPages) {
endPage = totalPages;
startPage = Math.max(1, endPage - maxVisiblePages + 1);
}
return Array.from({ length: endPage - startPage + 1 }, (_, i) => startPage + i);
};
分页样式优化

.pagination {
display: flex;
gap: 8px;
}
.pagination button {
padding: 6px 12px;
border: 1px solid #ddd;
background: white;
cursor: pointer;
}
.pagination button.active {
background: #007bff;
color: white;
border-color: #007bff;
}
.pagination button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
使用现成库
对于快速实现,可以考虑使用现成的React分页库:
- react-paginate
- material-ui pagination
- antd pagination
安装示例:
npm install react-paginate
使用示例:
import ReactPaginate from 'react-paginate';
function PaginatedItems({ itemsPerPage, items }) {
const [itemOffset, setItemOffset] = useState(0);
const endOffset = itemOffset + itemsPerPage;
const currentItems = items.slice(itemOffset, endOffset);
const pageCount = Math.ceil(items.length / itemsPerPage);
const handlePageClick = (event) => {
const newOffset = (event.selected * itemsPerPage) % items.length;
setItemOffset(newOffset);
};
return (
<>
<Items currentItems={currentItems} />
<ReactPaginate
breakLabel="..."
nextLabel="next >"
onPageChange={handlePageClick}
pageRangeDisplayed={5}
pageCount={pageCount}
previousLabel="< previous"
renderOnZeroPageCount={null}
/>
</>
);
}






