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

React 如何检测页面刷新并将用户重定向到指定页面

React 页面刷新检测与重定向优化方案

问题修复说明

废弃API替换

你用到的window.performance.navigation已被Web标准移除,官方推荐使用PerformanceNavigationTiming接口替代,通过以下代码可以获取导航类型:

// 返回值说明:
// 'navigate':普通路由跳转/链接进入
// 'reload':页面刷新
// 'back_forward':前进/后退进入
const getNavType = () => performance.getEntriesByType('navigation')[0]?.type

useEffect写法说明

多个useEffect拆分不同职责本身是符合React开发规范的,你原有代码的核心问题是第二个useEffect没有把hasRouteChanged加入依赖数组,存在闭包陷阱,永远读取的是初始的false值,逻辑会失效。

优雅实现方案

这里提供两种实现,根据你的业务场景选择:

方案1:最简实现(无需额外state)

仅判断刷新场景直接重定向,适合只需要拦截刷新操作的场景:

import { useEffect } from 'react'
import { useLocation } from 'react-router-dom'

const EligibilityPage = () => {
  const location = useLocation()

  useEffect(() => {
    const navType = performance.getEntriesByType('navigation')[0]?.type
    // 仅刷新场景触发重定向
    if (navType === 'reload') {
      window.location.href = "/personal-details-page"
    }
  }, [location])
}

方案2:稳定实现(sessionStorage辅助判断)

适合需要严格区分「刷新进入」和「路由跳转进入」的复杂场景,避免前进后退等操作误触发:

import { useEffect } from 'react'
import { useLocation } from 'react-router-dom'

const EligibilityPage = () => {
  const location = useLocation()

  // 路由离开时标记为主动跳转
  useEffect(() => {
    return () => {
      sessionStorage.setItem('isRouteJump', '1')
    }
  }, [location])

  // 页面初始化时判断是否为刷新
  useEffect(() => {
    const navType = performance.getEntriesByType('navigation')[0]?.type
    const isRouteJump = sessionStorage.getItem('isRouteJump')
    
    if (navType === 'reload' && !isRouteJump) {
      window.location.href = "/personal-details-page"
    }
    // 每次进入页面清除标记
    sessionStorage.removeItem('isRouteJump')
  }, [])
}

内容的提问来源于stack exchange,提问作者D.B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:51:01