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

Vue3中onMounted内window的load事件失效,如何解决?

解决Vue3中window.load事件不生效的问题

核心原因

当onMounted钩子执行时,window的load事件可能已经触发完毕,导致后续添加的监听器无法捕获到该事件。Vue3的onMounted仅保证当前组件的DOM挂载完成,而window.load是等待所有资源(图片、样式、脚本等)加载完成才触发,这个时机可能早于组件挂载完成的时间。

解决方案

1. 检查加载状态,兼容已完成的场景

先判断页面是否已经加载完成,避免错过事件触发时机:

<script setup>
import { onMounted } from 'vue';

onMounted(() => {
  const handleLoad = () => {
    alert("Window Loaded");
    // 移除监听避免内存泄漏
    window.removeEventListener('load', handleLoad);
  };

  if (document.readyState === 'complete') {
    handleLoad();
  } else {
    window.addEventListener('load', handleLoad);
  }
})
</script>

2. 全局提前监听(多组件共用场景)

如果多个组件都需要监听window.load,建议在应用初始化阶段就添加监听,确保不会错过事件:

// main.js
import { createApp } from 'vue';
import App from './App.vue';

const handleWindowLoad = () => {
  alert("Window Loaded");
  // 可将加载状态挂载到全局,供组件判断
  app.config.globalProperties.$isWindowLoaded = true;
};

// 先判断当前状态
if (document.readyState === 'complete') {
  handleWindowLoad();
} else {
  window.addEventListener('load', handleWindowLoad);
}

const app = createApp(App);
app.mount('#app');

后续组件可通过$isWindowLoaded判断加载状态,直接复用全局逻辑。

3. 用生命周期钩子替代(无需等资源加载场景)

如果你的逻辑仅需要DOM挂载完成即可执行,不需要等待所有资源加载,直接在onMounted中执行逻辑即可:

<script setup>
import { onMounted } from 'vue';

onMounted(() => {
  alert("DOM Mounted");
});
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:01:03