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

React中如何检测用户点击浏览器返回按钮前的页面来源路径?

React中检测浏览器返回前的页面来源路径

在React项目里,用户从A/B/C页面点击返回回到A/B时,要拿到之前的A/B/C路径,有几种实用的方法:

方法一:自定义维护访问历史栈

自己维护一个数组记录用户的访问路径,每次路由变化时更新这个栈,就能在返回时快速获取上一页路径。

示例代码(基于React Router v6):

import { useEffect, useState } from 'react';
import { useLocation } from 'react-router-dom';

function App() {
  const location = useLocation();
  const [historyStack, setHistoryStack] = useState([location.pathname]);

  useEffect(() => {
    // 路由跳转时,若为新页面则添加到栈中
    if (historyStack[historyStack.length - 1] !== location.pathname) {
      setHistoryStack(prev => [...prev, location.pathname]);
    }

    // 监听浏览器前进/后退事件
    const handlePopState = () => {
      // 栈的倒数第二项就是返回前的页面路径
      const prevPath = historyStack[historyStack.length - 2];
      if (prevPath) {
        console.log('返回前的页面路径:', prevPath);
        // 这里可添加业务逻辑,比如存储路径到状态
      }
      // 更新栈,移除当前返回的路径项
      setHistoryStack(prev => prev.slice(0, -1));
    };

    window.addEventListener('popstate', handlePopState);
    return () => window.removeEventListener('popstate', handlePopState);
  }, [location, historyStack]);

  return <div>你的应用内容</div>;
}

export default App;

方法二:结合React Router的导航类型判断

React Router v6+提供的useNavigationType钩子,能判断当前导航类型(POP对应浏览器前进/后退触发的导航),配合useLocation就能获取来源路径。

示例代码:

import { useEffect, useState } from 'react';
import { useLocation, useNavigationType } from 'react-router-dom';

function App() {
  const location = useLocation();
  const navigationType = useNavigationType();
  const [previousPath, setPreviousPath] = useState('');

  useEffect(() => {
    const currentPath = location.pathname;
    // 当导航类型为POP时,previousPath就是返回前的路径
    if (navigationType === 'POP') {
      console.log('返回前的页面路径:', previousPath);
    }
    // 更新previousPath为当前路径,供下一次判断使用
    setPreviousPath(currentPath);
  }, [location, navigationType]);

  return <div>你的应用内容</div>;
}

export default App;

方法三:监听popstate事件并读取history.state

浏览器的history.state可能存储了路径信息(取决于路由库实现),直接监听popstate事件即可获取:

import { useEffect } from 'react';

function App() {
  useEffect(() => {
    const handlePopState = (event) => {
      // event.state的结构由路由库决定,React Router会存储pathname
      if (event.state?.pathname) {
        console.log('返回前的页面路径:', event.state.pathname);
      }
    };

    window.addEventListener('popstate', handlePopState);
    return () => window.removeEventListener('popstate', handlePopState);
  }, []);

  return <div>你的应用内容</div>;
}

export default App;

注意:这种方法依赖路由库对history.state的处理,兼容性不如自定义栈稳定,建议结合使用。


内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:22:31