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

如何在Vue中通过@load判断最后一张预加载图片完成渲染?

解决Vue中图片预加载时判断最后一张加载完成的问题

你的核心问题是用单个布尔值无法区分最后一张图片的加载状态,因为每张图加载都会覆盖这个值。下面提供两种实用的解决方案:


方案一:用计数器追踪加载进度

通过记录已加载图片的数量,和需要加载的图片总数对比,相等时即可判定最后一张加载完成。

修改后的代码:

1. 数据定义

data() {
  return {
    loadedCount: 0, // 已加载图片数量
    totalImgs: 0    // 需要加载的图片总数
  }
},

2. 计算需加载的图片总数

在获取到slices数据后(比如接口请求成功后或mounted钩子中),计算总数:

mounted() {
  // 假设slices已在此处获取完成
  this.totalImgs = this.slices.length - 1; // 因为index>0才渲染图片,所以总数是slices长度减1
}

3. 调整加载回调方法

methods: {
  preload() {
    this.loadedCount++;
    // 当已加载数等于总数时,最后一张图片加载完成
    if (this.loadedCount === this.totalImgs) {
      // 在这里执行你的后续操作,比如隐藏加载动画、初始化交互等
      console.log('最后一张图片已加载完成,执行后续逻辑');
    }
  },
  // 可选:处理图片缓存导致@load不触发的情况
  checkCachedImgs() {
    this.$refs.preloadImgs?.forEach(img => {
      if (img.complete && !img.dataset.loaded) {
        this.loadedCount++;
        img.dataset.loaded = 'true';
        if (this.loadedCount === this.totalImgs) {
          console.log('最后一张图片已加载完成(缓存)');
        }
      }
    });
  }
},
updated() {
  // 每次视图更新后检查缓存的图片
  this.checkCachedImgs();
}

4. 模板调整(添加ref用于缓存检查)

<section v-for="(slice, index) in slices" :key="index" :data-id="index" class="h-screen flex items-center justify-center">
  <div class="max-w-[70%]">
    <img v-if="index > 0" :src="slice.items[0].image.url" @load="preload" ref="preloadImgs">
  </div>
</section>

方案二:用Promise.all批量预加载

直接创建图片对象并监听加载状态,通过Promise.all等待所有图片加载完成,无需依赖模板的@load事件。

修改后的代码:

data() {
  return {
    slices: []
  }
},
async mounted() {
  // 先获取slices数据(示例:接口请求)
  // const response = await fetch('your-api-endpoint');
  // this.slices = await response.json();

  // 收集需要预加载的图片URL(过滤index>0的项)
  const imgUrls = this.slices.slice(1).map(slice => slice.items[0].image.url);

  // 生成图片加载的Promise数组
  const loadPromises = imgUrls.map(url => {
    return new Promise((resolve, reject) => {
      const img = new Image();
      img.src = url;
      img.onload = () => resolve(url);
      img.onerror = () => reject(new Error(`图片加载失败:${url}`));
    });
  });

  try {
    // 等待所有图片加载完成
    await Promise.all(loadPromises);
    // 所有图片(包括最后一张)加载完成,执行后续操作
    console.log('所有图片预加载完成,执行后续逻辑');
  } catch (error) {
    console.error('部分图片加载失败:', error);
    // 可根据需求处理加载失败的情况
  }
}

方案对比

  • 方案一适合依赖模板渲染图片的场景,能同步DOM渲染状态,同时处理缓存图片的加载判定。
  • 方案二更适合主动提前预加载,图片加载完成后再渲染到页面,能提升首屏体验,也更易处理加载失败的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:33:31