当前位置: 首页 > 知识库问答 >
问题:

javascript - Vue3 onload 方法不执行的原因及解决方案?

赖诚
2024-04-09

vue3不执行onload方法
下面是我的测试代码,mounted和nextTick总是前后脚一起打印出来,但onload不执行
我的需求是弄一个loading,所以需要监听页面是否完全加载完成关闭loading

window.onload = () => {  console.log('loaded')}onMounted(() => {  console.log('mounted')  nextTick(() => {    console.log('nextTick');  })})

会出现背景图还没渲染完成的情况
image.png

共有4个答案

堵远航
2024-04-09

因为 window.onload 在很早之前就执行好了,并不是不执行……你可以在 index.html 中直接加上这个 onload 的事件处理打印出来看看。它会在你的入口 文件执行之前在控制台输出。


另外就是你得了解一下Vue的生命周期函数的执行。

  • Vue3生命周期 - SegmentFault 思否

如果在 mounted 之后没有数据更新,你的两个 log 就是差不多同时输出的。


所以如果你想要在页面全部加载完毕关闭loading,得看你的加载完成是指是什么了。
是Vue初始化完成,还是当前页面组件渲染完毕,还是异步数据请求回来之后子组件也都渲染完毕了。

常自怡
2024-04-09

mounted()钩子函数会在页面和组件加载完成后执行,而$nextTick()方法可以确保在页面和组件数据更新完成后再执行下一步操作。因此,结合使用这两个方法可以监控到页面和组件中的所有数据是否全部加载完成。例如,在mounted()钩子函数中使用$nextTick()方法可以确保页面数据更新完毕后再执行下一步操作。

onBeforeMount(() => {  loading.value = true})onMounted(async () => {  await nextTick()  loading.value = false})
郎玮
2024-04-09

你onload只有写在入口main.js内才有效。否则其他控件内都已经在onload之后了。所以在组件内是不会触发onload事件的。在vue组件中只能使用$nextTick来确保组件挂载完毕之后执行。

杨波娃
2024-04-09

Vue3 中不再支持 window.onload,这是因为 Vue3 使用了新的生命周期钩子函数,如 onMountedonUpdatedonUnmounted 等,来替代了 Vue2 中的 mountedupdateddestroyed 以及全局的 window.onloadwindow.onbeforeunload 等。

在你的代码中,window.onload 没有执行,可能是因为 Vue3 已经接管了应用的生命周期,并且不再触发全局的 window.onload 事件。

对于你的需求,你可以在 Vue3 的 onMounted 生命周期钩子函数中关闭 loading。因为 onMounted 会在实例被挂载到 DOM 后调用,这时你可以认为页面已经完全加载完成。nextTick 在这里不是必需的,因为 onMounted 已经确保了在 DOM 更新后执行。

以下是一个示例:

import { ref, onMounted } from 'vue'export default {  setup() {    const isLoading = ref(true) // 初始化一个响应式变量来控制 loading 的显示和隐藏    onMounted(() => {      console.log('mounted')      isLoading.value = false // 在组件挂载后关闭 loading    })    return {      isLoading // 返回 isLoading 变量,以便在模板中使用    }  }}

在模板中,你可以根据 isLoading 的值来决定是否显示 loading:

<template>  <div v-if="isLoading">Loading...</div>  <!-- 其他内容 --></template>

这样,当组件挂载后,loading 就会自动关闭。

 类似资料:
  • 本文向大家介绍关闭页面window.location事件未执行的原因及解决方法,包括了关闭页面window.location事件未执行的原因及解决方法的使用技巧和注意事项,需要的朋友参考一下 1、问题描述: JS中定义widow.location = function(),页面关闭时,logout()函数未执行。 2、问题原因: logout()中调用SOAPClient.invoke()方法,参

  • 本文向大家介绍Java String.replace()方法"无效"的原因及解决方式,包括了Java String.replace()方法"无效"的原因及解决方式的使用技巧和注意事项,需要的朋友参考一下 首先我们来看个例子 运行结果是什么呢?我们先看看这个方法的api 返回一个新的字符串,用newChar替换此字符串中出现的所有oldChar 所以这里的结果为:输出结果是abcd 而不是fbcd,

  • 本文向大家介绍javascript跨域原因以及解决方案分享,包括了javascript跨域原因以及解决方案分享的使用技巧和注意事项,需要的朋友参考一下 产生跨域问题的原因 跨域问题是浏览器同源策略限制,当前域名的js只能读取同域下的窗口属性。 跨域问题产生的场景 当要在在页面中使用js获取其他网站的数据时,就会产生跨域问题,比如在网站中使用ajax请求其他网站的天气、快递或者其他数据接口时以及hy

  • 本文向大家介绍MySQL无法创建外键的原因及解决方法,包括了MySQL无法创建外键的原因及解决方法的使用技巧和注意事项,需要的朋友参考一下 关联2张表时出现了无法创建外键的情况,从这个博客看到,问题出在第六点的Charset和Collate选项在表级和字段级上的一致性上。我的2张表的编码charset和collate不一致,2张表都执行执行SQL语句: 完美解决问题; ps:下面看下MySQL无法

  • 本文向大家介绍form.submit()不能提交表单的错误原因及解决方法,包括了form.submit()不能提交表单的错误原因及解决方法的使用技巧和注意事项,需要的朋友参考一下 直接上代码把: 结果是测试了许久都没有看到提示信息,以为是代码错了或者方法写错了,仔细核对,在结果官方文档,确认没有出错。 formId.submit()不能提交,就暂时只好把btnSubmit的type改为submit

  • 本文向大家介绍MSSQL产生死锁的根本原因及解决方法,包括了MSSQL产生死锁的根本原因及解决方法的使用技巧和注意事项,需要的朋友参考一下 一、 什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程. 二、 死锁产生的四个必要条件 •互斥条件:指进程