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

Quasar中使用@load/onload事件时图片骨架加载器无限加载的问题求助

Quasar中使用@load/onload事件时图片骨架加载器无限加载的问题求助

大家好,我在Quasar项目里遇到了一个头疼的问题:图片的骨架加载器会无限加载,始终无法自动隐藏,不管是用Quasar q-img组件的@load事件,还是原生Image对象的onload方法都解决不了,想请大家帮忙看看。

第一种尝试:直接用q-img的@load事件

最开始我参考Quasar文档,用q-img的@load事件来监听图片加载完成,然后控制骨架的显示:

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

const imgLoaded = ref({});
</script>

<template>
  <!-- 图片未加载完成时显示骨架 -->
  <q-skeleton v-if="!imgLoaded[img?.image_url]"></q-skeleton>
  <!-- 加载完成后触发@load,标记该图片已加载 -->
  <q-img @load="(url) => imgLoaded[url] = true" :src="img?.image_url" />
</template>

根据Quasar文档,@load事件会在浏览器成功加载图片后触发,参数就是该图片的URL。按逻辑,当imgLoaded[url]被设为true后,v-if的条件不满足,骨架就会消失,显示出图片。但实际运行时,骨架一直在无限加载,完全没反应。

第二种尝试:用原生Image对象预加载

后来我换了个思路,在组件挂载后用原生Image对象预加载所有图片,通过onload事件标记加载完成:

<script setup>
import { ref, onMounted } from 'vue';
import { storeProducts } from '@/stores/products';

const imgLoaded = ref({});

const onImgLoad = (url) => {
    imgLoaded.value[url] = true;
};

onMounted(() => {
    // 从store中获取商品列表,预加载每个商品的图片
    if (storeProducts.featuredProducts && storeProducts.featuredProducts.length) {
        storeProducts.featuredProducts.forEach((product) => {
            const img = new Image();
            img.onload = () => onImgLoad(product?.image_url);
            img.src = product?.image_url;
        });
    }
});
</script>

<template>
  <q-skeleton v-if="!imgLoaded[img?.image_url]"></q-skeleton>
  <q-img :src="img?.image_url" />
</template>

结果还是一样的问题,骨架加载器始终停留在页面上,根本不会消失。

我观察到的细节

我排查的时候发现两个奇怪的点:

  • imgLoaded.value初始值是{},我并没有预先把每个图片URL对应的属性设为false;
  • 不管用哪种方法,图片加载完成后,imgLoaded[img.image]都没有被成功设为true——这应该是骨架不消失的直接原因,但我找不到为什么赋值不生效。

有没有大佬能帮我分析下问题出在哪?或者有没有其他可靠的方法来控制Quasar骨架加载器的显示隐藏?

备注:内容来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:39:50