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

ReactPaginate上下分页器状态不同步问题求助

解决ReactPaginate双分页器状态不同步问题

问题核心在于你给forcePage传了偏移量itemOffset,但ReactPaginate的forcePage需要的是从零开始的当前页码,不是数据偏移量。按下面步骤修改即可同步两个分页器:

1. 计算当前页码

在组件里基于itemOffset和itemsPerPage计算当前选中的页码:

const currentPage = Math.floor(itemOffset / itemsPerPage);

2. 给两个ReactPaginate组件添加forcePage属性

把计算好的currentPage传给两个分页器的forcePage,让它们基于同一个状态渲染选中页。

3. 简化handlePageClick逻辑

原来的取模操作没必要,ReactPaginate会根据pageCount限制可点击的页码,直接用选中的页码计算偏移量即可。

修改后的完整代码

const CarsSection = () => {
  const itemsPerPage = 8;
  const [itemOffset, setItemOffset] = useState(0);
  const endOffset = itemOffset + itemsPerPage;
  const currentItems = carsData.slice(itemOffset, endOffset);
  const pageCount = Math.ceil(carsData.length / itemsPerPage);
  // 计算当前页码
  const currentPage = Math.floor(itemOffset / itemsPerPage);

  const handlePageClick = (event) => {
    // 直接用选中的页码计算新偏移量
    const newOffset = event.selected * itemsPerPage;
    setItemOffset(newOffset);
  };

  return (
    <>
      <PaginateContainer>
        <ReactPaginate
          nextLabel=">"
          onPageChange={handlePageClick}
          pageRangeDisplayed={3}
          marginPagesDisplayed={2}
          pageCount={pageCount}
          previousLabel="<"
          pageClassName="page-item"
          pageLinkClassName="page-link"
          previousClassName="page-item"
          previousLinkClassName="page-link"
          nextClassName="page-item"
          nextLinkClassName="page-link"
          breakLabel="..."
          breakClassName="page-item"
          breakLinkClassName="page-link"
          containerClassName="pagination"
          activeClassName="active"
          renderOnZeroPageCount={null}
          // 添加forcePage绑定当前页码
          forcePage={currentPage}
        />
      </PaginateContainer>
      <CarsContainer>
        <Items currentItems={currentItems} />
      </CarsContainer>
      {/* 底部分页器,同样添加forcePage */}
      <PaginateContainer>
        <ReactPaginate
          nextLabel=">"
          onPageChange={handlePageClick}
          pageRangeDisplayed={3}
          marginPagesDisplayed={2}
          pageCount={pageCount}
          previousLabel="<"
          pageClassName="page-item"
          pageLinkClassName="page-link"
          previousClassName="page-item"
          previousLinkClassName="page-link"
          nextClassName="page-item"
          nextLinkClassName="page-link"
          breakLabel="..."
          breakClassName="page-item"
          breakLinkClassName="page-link"
          containerClassName="pagination"
          activeClassName="active"
          renderOnZeroPageCount={null}
          forcePage={currentPage}
        />
      </PaginateContainer>
    </>
  );
};

export default CarsSection;

这样修改后,不管点击顶部还是底部分页器,两个组件都会基于currentPage同步选中状态,数据列表也会跟着更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:15:32