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

如何区分页面重载与重渲染?React函数组件识别页面重载方法

在React函数组件中识别页面重载的方法

要区分页面重载(浏览器刷新)和组件内部重渲染/路由跳转导致的挂载,可以用以下两种可靠方法:

方法1:利用Performance API判断导航类型

performance API提供了页面导航的详细信息,能直接识别是否是页面重载:

import { useEffect } from 'react';

function YourComponent() {
  useEffect(() => {
    // 获取页面导航记录
    const navigationDetails = performance.getEntriesByType('navigation')[0];
    // 判断导航类型是否为重载
    if (navigationDetails?.type === 'reload') {
      console.log('页面发生了重载');
      // 这里执行页面重载需要的逻辑
    }
  }, []); // 空依赖数组确保只在组件挂载时执行一次

  return <div>你的组件内容</div>;
}

导航类型说明:

  • reload: 页面通过刷新按钮或location.reload()触发重载
  • navigate: 页面首次加载或通过链接/路由跳转的正常导航
  • back_forward: 通过浏览器前进/后退按钮触发的导航

方法2:使用sessionStorage标记(兼容旧浏览器)

如果需要兼容不支持performance.getEntriesByType的旧浏览器,可以用sessionStorage标记区分页面重载和组件挂载:

import { useEffect } from 'react';

function YourComponent() {
  useEffect(() => {
    const reloadMarker = sessionStorage.getItem('pageReloadMarker');
    
    if (!reloadMarker) {
      // 没有标记,说明是页面首次加载或重载
      console.log('页面首次加载/重载');
    } else {
      // 存在标记,说明是路由跳转导致的组件重新挂载
      console.log('组件路由跳转挂载');
      sessionStorage.removeItem('pageReloadMarker');
    }

    // 组件正常卸载(路由跳转)时设置标记
    return () => {
      sessionStorage.setItem('pageReloadMarker', 'true');
    };
  }, []);

  return <div>你的组件内容</div>;
}

注意:

这种方法无法区分首次加载和页面重载,只能区分是页面级别的加载(首次/重载)还是应用内部的组件挂载(路由跳转)。如果需要精准区分重载,优先用方法1。

为什么你的原代码会每次重渲染触发?

你提供的代码:

useEffect(() => {
  console.log("page rerender")
})

因为没有设置依赖数组,React会在每次组件重渲染时都执行这个useEffect。如果要只在组件挂载时执行(对应类组件的constructor执行时机),必须加上空依赖数组[]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 06:42:34