在 react 应用中,直接绑定 `window.onload` 常因组件生命周期与 dom 加载时序错位而失效;应改用 `useeffect` 配合空依赖数组,确保仅在组件挂载时执行一次初始化逻辑。
React 是声明式、基于组件生命周期的 UI 框架,其渲染流程(如虚拟 DOM 挂载、Fiber 调度)与传统 HTML 页面的 window.onload(等待所有资源加载完成)并不同步。尤其在使用高阶组件(HOC)封装布局时,window.onload = ... 的赋值行为存在严重隐患:
✅ 正确做法是利用 React 官方推荐的副作用机制 —— useEffect,并传入空依赖数组 [],使其等价于类组件中的 componentDidMount:
import { useEffect } from 'react';
import { useDispatch } from 'react-redux';
function layout(WrappedComponent) {
return function Layout(props) {
const dispatch = useDispatch();
const UserInfo = async () => {
try {
const response = await me();
const authUser = response.data.user;
dispatch(updateOnboardingSteps(authUser.onboarding_steps_state));
} catch (error) {
console.error("Failed to fetch user info:", error);
// 可选:统一错误处理或通知用户
}
};
// ✅ 替代 window.onload:仅在 Layout 组件首次挂载时执行
useEffect(() => {
UserInfo();
}, []); // 空依赖数组 → 仅执行一次
return ;
};
}
export default layout;? 关键说明:
? 额外建议:对于真正需要监听全局资源加载完成的场景(如字体、第三方脚本),应使用 document.readyState 或 PerformanceObserver,而非依赖 window.onload —— 但在 React 数据初始化中,useEffect + [] 始终是首选且最可靠的方案。