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

React切换pageSize时状态滞后问题求助

解决方案

问题根源有两个:一是useMemo的依赖数组不完整,二是切换pageSize时未同步重置currentPage,导致状态不同步和数据计算滞后。

1. 补全useMemo的依赖数组

你的currentPaginationData计算依赖currentPage、pageSize和blogs.posts,但原代码只把currentPage放进了依赖数组。当pageSize变化时,useMemo不会重新执行计算,自然拿不到新的分页数据。

修改后:

const currentPaginationData = useMemo(() => {
  const start = (currentPage - 1) * pageSize; // 简化计算逻辑,整数运算无需Math.floor
  const end = start + pageSize;
  // slice方法在end超出数组长度时会自动取到末尾,无需额外判断
  return blogs.posts.slice(start, end);
}, [currentPage, pageSize, blogs.posts]); // 补全所有依赖项

2. 切换pageSize时重置currentPage

当用户切换每页条数时,当前页码可能不再适配新的分页规则(比如原pageSize=15、currentPage=3,总数据40条;切换到pageSize=25后,总页数仅为2,currentPage=3就超出范围了)。所以在更新pageSize的同时,必须把currentPage重置为1,保证状态同步:

const updateRowsPerPage = (rows) => {
  setPageSize(parseInt(rows));
  setCurrentPage(1); // 切换每页条数时重置页码到第一页
};

完整修改后的代码

const PAGE_SIZES = [15, 25, 50, 100];
function BlogList() {
  const [currentPage, setCurrentPage] = useState(1);
  const [pageSize, setPageSize] = useState(PAGE_SIZES[0]);
  
  const updatePage = (pageNum) => {
    setCurrentPage(parseInt(pageNum));
  }; 
  
  const updateRowsPerPage = (rows) => {
    setPageSize(parseInt(rows));
    setCurrentPage(1); // 新增:重置页码
  };
  
  const currentPaginationData = useMemo(() => {
    const start = (currentPage - 1) * pageSize;
    const end = start + pageSize;
    return blogs.posts.slice(start, end);
  }, [currentPage, pageSize, blogs.posts]); // 补全依赖
}

这样修改后,切换pageSize时会立刻重置页码并重新计算分页数据,彻底解决状态滞后的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:25:26