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

React/Typescript下如何动态检测浏览器刷新?

解决方案:React/TypeScript 检测浏览器刷新操作

针对你遇到的performance API状态无法重置、window.event已废弃的问题,以下是两种可靠的实现方案,覆盖F5快捷键和浏览器刷新按钮触发的场景:

方案1:结合 beforeunload 与 sessionStorage 精准区分刷新与路由跳转

核心思路是在页面即将卸载时标记状态,页面加载时校验标记,同时在路由跳转时清除标记,避免误判。

import { useEffect } from 'react';

// 自定义Hook封装刷新检测逻辑
const useDetectRefresh = (onRefresh: () => void) => {
  useEffect(() => {
    // 页面加载时检查是否由刷新触发
    const isRefresh = sessionStorage.getItem('isRefreshing');
    if (isRefresh) {
      onRefresh();
      sessionStorage.removeItem('isRefreshing');
    }

    // 监听页面卸载事件,标记即将执行刷新
    const handleBeforeUnload = () => {
      sessionStorage.setItem('isRefreshing', 'true');
    };

    window.addEventListener('beforeunload', handleBeforeUnload);

    return () => {
      window.removeEventListener('beforeunload', handleBeforeUnload);
      // 路由跳转时清除标记,防止把路由切换误判为刷新
      sessionStorage.removeItem('isRefreshing');
    };
  }, [onRefresh]);
};

// 在组件中使用
const App = () => {
  const handleRefresh = () => {
    localStorage.removeItem('products-list');
    console.log('检测到浏览器刷新');
  };

  useDetectRefresh(handleRefresh);

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

export default App;

方案2:监听F5快捷键 + beforeunload 覆盖全场景

针对用户手动按F5的场景直接触发操作,同时通过sessionStorage处理点击刷新按钮的情况,确保所有刷新场景都被覆盖。

import { useEffect } from 'react';

const useDetectRefresh = (onRefresh: () => void) => {
  useEffect(() => {
    let isF5Pressed = false;

    // 监听F5按键事件
    const handleKeyDown = (e: KeyboardEvent) => {
      if (e.key === 'F5') {
        isF5Pressed = true;
        onRefresh();
      }
    };

    // 监听页面卸载,处理点击刷新按钮的场景
    const handleBeforeUnload = () => {
      if (!isF5Pressed) {
        sessionStorage.setItem('refreshTriggered', 'true');
      }
    };

    // 页面加载时校验是否为刷新按钮触发的刷新
    const checkRefreshOnLoad = () => {
      const refreshTriggered = sessionStorage.getItem('refreshTriggered');
      if (refreshTriggered) {
        onRefresh();
        sessionStorage.removeItem('refreshTriggered');
      }
    };

    window.addEventListener('keydown', handleKeyDown);
    window.addEventListener('beforeunload', handleBeforeUnload);
    checkRefreshOnLoad();

    return () => {
      window.removeEventListener('keydown', handleKeyDown);
      window.removeEventListener('beforeunload', handleBeforeUnload);
      sessionStorage.removeItem('refreshTriggered');
    };
  }, [onRefresh]);
};

// 使用示例同方案1

补充:performance API方案的局限性说明

你提到的performance.getEntriesByType('navigation')方案,仅在页面首次加载时能准确检测刷新状态,多次刷新后可能因浏览器缓存或API状态未更新导致检测失效,因此不推荐作为核心方案,仅可用于简单场景的首次加载检测。

内容的提问来源于stack exchange,提问作者Rodrigo César Nunes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:22:36