You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ReactJS/JavaScript分页组件中添加页码间省略号

React分页组件:实现带省略号的页码显示

嘿,我来帮你搞定这个带省略号的分页逻辑,这是分页组件里超实用的功能,刚好完美匹配你给出的所有场景规则。咱们先理清楚核心思路,再上可直接用的代码。

核心逻辑梳理

我们要根据当前选中页和总页数动态生成展示的页码列表,列表里可以是数字页码,也可以用'...'代表省略区域。对应你的需求,规则可以拆解为:

  • 总页数<9时:直接显示全部页码,当前页高亮
  • 总页数≥9时:
    • 当前页靠近开头(前3页):展示「首页 + 当前页前后1页 + 省略号 + 最后3页」
    • 当前页在中间区域:展示「首页 + 省略号 + 当前页前后1页 + 省略号 + 末页」
    • 当前页靠近末尾(后3页):展示「前3页 + 省略号 + 当前页前后1页 + 末页」

完整实现代码

第一步:写生成页码的工具函数

这个函数是核心,负责根据当前页和总页数输出要渲染的页码数组:

const generatePageNumbers = (currentPage, totalPages) => {
  const pages = [];
  
  // 场景1:总页数少于9,直接显示所有页码
  if (totalPages < 9) {
    for (let i = 1; i <= totalPages; i++) {
      pages.push(i);
    }
    return pages;
  }
  
  // 场景2:总页数≥9,分情况处理
  // 当前页是前3页(比如第1、2、3页)
  if (currentPage <= 3) {
    pages.push(1, 2, 3, 4, '...', totalPages - 2, totalPages - 1, totalPages);
  } 
  // 当前页是最后3页
  else if (currentPage >= totalPages - 2) {
    pages.push(1, 2, 3, '...', totalPages - 3, totalPages - 2, totalPages - 1, totalPages);
  }
  // 当前页在中间区域
  else {
    pages.push(
      1,
      '...',
      currentPage - 1,
      currentPage,
      currentPage + 1,
      '...',
      totalPages
    );
  }
  
  return pages;
};

第二步:封装React分页组件

把工具函数整合到组件里,处理点击事件和状态:

import { useState } from 'react';

const Pagination = ({ totalPages, onPageChange }) => {
  const [currentPage, setCurrentPage] = useState(1);

  const handlePageClick = (page) => {
    if (page === '...') return; // 点击省略号不触发跳转
    setCurrentPage(page);
    onPageChange(page);
  };

  const pageNumbers = generatePageNumbers(currentPage, totalPages);

  return (
    <div className="pagination">
      {pageNumbers.map((page, index) => (
        <button
          key={index}
          onClick={() => handlePageClick(page)}
          className={`page-btn ${currentPage === page ? 'active' : ''}`}
          disabled={page === '...'}
        >
          {page}
        </button>
      ))}
    </div>
  );
};

export default Pagination;

第三步:添加基础样式(可选)

给按钮加些样式让分页更直观:

.pagination {
  display: flex;
  gap: 8px;
  list-style: none;
  padding: 16px 0;
  justify-content: center;
}

.page-btn {
  padding: 8px 14px;
  border: 1px solid #e0e0e0;
  border-radius: 4px;
  background: #fff;
  cursor: pointer;
  transition: all 0.2s;
}

.page-btn.active {
  background: #2196f3;
  color: #fff;
  border-color: #2196f3;
}

.page-btn:disabled {
  cursor: default;
  color: #ccc;
  border-color: #f0f0f0;
}

.page-btn:hover:not(:disabled):not(.active) {
  background: #f5f5f5;
}

场景验证(匹配你的需求)

咱们对应你给出的例子逐一验证:

  • 总页数<9,选中第1页:[1,2,3,4,5,6,7,8] → 正确显示全部页码,1高亮
  • 总页数<9,选中第5页:[1,2,3,4,5,6,7,8] → 正确显示全部页码,5高亮
  • 总页数<9,选中第8页:[1,2,3,4,5,6,7,8] → 正确显示全部页码,8高亮
  • 总页数=9,选中第2页:[1,2,3,4,'...',7,8,9] → 匹配你给出的f场景
  • 总页数=9,选中第3页:[1,2,3,4,'...',7,8,9] → 匹配你给出的g场景
  • 总页数=9,选中第4页:[1,'...',3,4,5,'...',9] → 中间区域显示省略号,符合预期

这样就完全覆盖了你需要的所有分页显示规则啦!

内容的提问来源于stack exchange,提问作者pourushsingh gaur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:40:31