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

ReactJS分页返回后重置为第1页的问题求解

解决React分页返回后页码重置的问题

当前你的分页状态存在组件的useState中,一旦路由切换导致组件卸载再重新挂载,useState会回到初始值1,所以返回后页码重置。要解决这个问题,核心是把页码状态持久化到URL参数或者本地存储,这里推荐用URL参数,更符合浏览器前进后退的导航逻辑,也支持页面刷新和分享链接。

方案1:通过URL搜索参数持久化页码(推荐)

修改Home.js代码

使用React Router的useLocation读取当前URL的参数,useNavigate更新URL参数,确保页码和URL同步:

import { useState, useEffect } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import CustomPagination from './Pagination';

const Home = () => {
  const location = useLocation();
  const navigate = useNavigate();
  // 从URL参数读取初始页码,没有则默认1
  const [page, setPage] = useState(() => {
    const searchParams = new URLSearchParams(location.search);
    return parseInt(searchParams.get('page')) || 1;
  });

  // 当页码变化时,更新URL参数
  useEffect(() => {
    const searchParams = new URLSearchParams(location.search);
    if (page === 1) {
      searchParams.delete('page'); // 页码为1时移除参数,保持URL简洁
    } else {
      searchParams.set('page', page.toString());
    }
    navigate({ search: searchParams.toString() }, { replace: true }); // 替换当前历史记录,避免重复条目
  }, [page, location.search, navigate]);

  useEffect(() => {
    fetchData();
  }, [page]);

  const fetchData = () => {
    // 你的数据请求逻辑,使用page参数获取对应页数据
    console.log(`获取第${page}页数据`);
  };

  return (
    <div>
      {/* 你的列表内容 */}
      <CustomPagination setPage={setPage} page={page} />
    </div>
  );
};

export default Home;

修改Pagination.js(优化选中状态)

给MUI的Pagination组件加上page属性,让它能正确显示当前选中的页码:

import React from 'react'
import { Pagination } from '@mui/material';

const CustomPagination = (props) => {
  const handlePageChange = (event, page) => {
    props.setPage(page);
  }

  return (
    <Pagination 
      count={10}
      onChange={handlePageChange}
      color="primary"
      size='large'
      page={props.page} // 绑定当前页码,确保选中状态正确
    />
  )
}

export default CustomPagination

方案2:通过localStorage持久化页码

如果不需要在URL中显示页码,可以用localStorage存储:

修改Home.js代码

import { useState, useEffect } from 'react';
import CustomPagination from './Pagination';

const Home = () => {
  // 从localStorage读取初始页码,没有则默认1
  const [page, setPage] = useState(() => {
    return parseInt(localStorage.getItem('currentPage')) || 1;
  });

  // 页码变化时保存到localStorage
  useEffect(() => {
    localStorage.setItem('currentPage', page.toString());
  }, [page]);

  useEffect(() => {
    fetchData();
  }, [page]);

  const fetchData = () => {
    console.log(`获取第${page}页数据`);
  };

  return (
    <div>
      {/* 你的列表内容 */}
      <CustomPagination setPage={setPage} page={page} />
    </div>
  );
};

export default Home;

方案对比

  • URL参数方案:支持浏览器前进后退、页面刷新、分享链接,完全符合网页浏览的常规体验。
  • localStorage方案:页码不会暴露在URL中,但刷新或重新打开页面会保留上次的页码,适合不需要分享的内部系统场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 04:10:36