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

React中如何实现window.load完成时执行方法且组件重渲染时也可触发?

方案评估与优化实现

你当前的方案可以正常运行,但不是最优方案,存在几个可优化的问题:

  • 模块级全局变量windowHasLoaded有状态污染风险:服务端渲染(SSR)场景下会跨请求共享状态导致错乱,页面存在多个该组件实例时也会互相干扰
  • 代码存在笔误:判断条件写的是windowLoaded,和你定义的变量名windowHasLoaded不一致
  • 额外引入了不必要的isReady状态,增加了无效的组件渲染开销

最优实现方案

不需要手动维护全局加载状态,直接读取浏览器原生提供的document.readyState属性即可:window.load事件触发后,document.readyState的值会固定为complete,天然就是全局正确的加载状态,无需自行维护。

优化后的代码如下:

import React from "react";

const MyComponent = () => {
  const doSomething = () => {
    // 你的业务逻辑
  }

  React.useEffect(() => {
    // 页面已经加载完成,直接执行逻辑
    if (document.readyState === 'complete') {
      doSomething()
      return
    }

    // 还未加载完成,绑定load事件监听
    const handleWindowLoaded = () => {
      doSomething()
    }
    window.addEventListener('load', handleWindowLoaded)

    // 组件卸载时移除监听,避免内存泄漏
    return () => {
      window.removeEventListener('load', handleWindowLoaded)
    };
  }, []);

  return (
    <>
      <div>Test</div>
    </>
  );
};

export default MyComponent;

该方案的优势:

  • 无自定义全局变量,不存在状态污染问题,兼容SSR、多组件实例等所有场景
  • 去掉了不必要的状态定义,减少了无效重渲染
  • 逻辑更简洁,可读性和可维护性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:54:01