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

React中点击浏览器返回按钮后如何获取上一页路径(react-router-dom)

在react-router-dom中获取回退前的路径(从PageB返回PageA时拿到/path-b)

直接给你几个可行的方案,都是基于react-router-dom v6的主流用法:

方案1:跳转时存状态,回退时读取

这个是最稳妥的,完全依赖react-router的状态管理,没有跨域或环境限制:

  1. 从PageA跳去PageB的时候,把目标路径存在导航状态里:
// PageA.tsx
import { useNavigate } from 'react-router-dom';

const PageA = () => {
  const navigate = useNavigate();

  const goToPageB = () => {
    // 把要跳去的/path-b存到state里
    navigate('/path-b', { state: { from: '/path-b' } });
  };

  return <button onClick={goToPageB}>去PageB</button>;
};
  1. 在PageA里,用useNavigationType判断是不是浏览器回退操作(POP类型),再通过useLocation取出之前存的路径:
// PageA.tsx
import { useLocation, useNavigationType } from 'react-router-dom';

const PageA = () => {
  const location = useLocation();
  const navType = useNavigationType();

  // 只有当是浏览器回退/前进(POP)的时候才处理
  if (navType === 'POP') {
    const prevPath = location.state?.from;
    if (prevPath) {
      console.log('刚才从这个路径回来:', prevPath); // 这里就是/path-b
      // 这里写你要执行的逻辑
    }
  }

  return <div>Page A</div>;
};

方案2:监听浏览器原生popstate事件

如果不想手动存状态,也可以直接监听浏览器的回退事件,配合document.referrer拿到前一页路径:

// PageA.tsx
import { useEffect } from 'react';

const PageA = () => {
  useEffect(() => {
    const handleBack = (event: PopStateEvent) => {
      // document.referrer会返回上一页的完整URL,提取路径部分
      const prevUrl = document.referrer;
      if (prevUrl) {
        const prevPath = new URL(prevUrl).pathname;
        if (prevPath === '/path-b') {
          console.log('回退前的路径是:', prevPath);
        }
      }
    };

    window.addEventListener('popstate', handleBack);
    // 组件卸载时记得移除监听,避免内存泄漏
    return () => window.removeEventListener('popstate', handleBack);
  }, []);

  return <div>Page A</div>;
};

⚠️ 注意:document.referrer只在同域名跳转时有效,如果是跨域或者用户直接输入URL进来,这个值会是空的。

方案3:用数据路由的loader钩子(v6.4+)

如果你用了react-router的createBrowserRouter数据路由,可以在PageA的loader里直接获取导航信息:

先配置路由:

// router.tsx
import { createBrowserRouter } from 'react-router-dom';
import PageA from './PageA';
import PageB from './PageB';

const router = createBrowserRouter([
  {
    path: '/path-a',
    element: <PageA />,
    loader: ({ navigationType, request }) => {
      let prevPath = '';
      // 判断是回退操作的话,从request状态里取之前存的路径
      if (navigationType === 'POP') {
        prevPath = request.state?.from || '';
      }
      return { prevPath };
    },
  },
  {
    path: '/path-b',
    element: <PageB />,
  },
]);

export default router;

然后在PageA里用useLoaderData拿到数据:

// PageA.tsx
import { useLoaderData } from 'react-router-dom';

const PageA = () => {
  const { prevPath } = useLoaderData() as { prevPath: string };
  
  if (prevPath) {
    console.log('回退前的路径:', prevPath);
  }

  return <div>Page A</div>;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:13:13