Vue使用new Image()实现图片预加载功能

 更新时间:2024年11月28日 09:51:10   作者:不爱说话郭德纲  
这篇文章主要介绍了如何在 Vue 中实现图片预加载的一个简单小demo以及优化方案,文中通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

在 Vue 中实现图片预加载

1. 创建一个 Vue 组件

我们将创建一个 Vue 组件,并在其中使用 created 生命周期钩子来预加载图片。这里使用 new Image() 的方式来预加载图片。

2. 示例代码

<template>
  <div>
    <!-- 显示的图片 -->
    <img :src="image1Src" alt="Image 1" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 绑定到页面上的图片路径
      image1Src: "img1.png",
    };
  },
  created() {
    this.preloadImage(this.image1Src); // 预加载图片
  },
  methods: {
    // 预加载图片的方法
    preloadImage(src) {
      const img = new Image(); 
      img.src = src;        
      img.onload = () => {
        console.log('Image loaded:', src); // 图片加载完成后的回调
      };
      img.onerror = () => {
        console.error('Failed to load image:', src); // 图片加载失败的回调
      };
    }
  }
};
</script>

代码解析

当你设置 img.src = src 时,浏览器会开始按照提供的 src 路径去加载图片资源。这个过程包括:

  • 请求:浏览器向服务器发送请求,获取图片文件。
  • 加载:图片文件从服务器下载到浏览器的缓存。
  • 渲染:浏览器在需要显示图片时,从缓存中加载并渲染它。

扩展:在 Vue 中预加载大量图片

如果你需要预加载大量图片,可以通过数组和循环来实现:

export default {
  data() {
    return {
      images: [
        'https://img1.png',
        'https://img1.png',
        'https://img2.png',
        // 其他图片路径
      ]
    };
  },
 created() {
     this.preLoadimg()
 },
 methods: {
      preLoadimg() {
        let count = 0;
        for (let img of this.imgs) {
          let image = new Image();
          image.src = img;
          if (image.complete) {
            console.log('图片已经在缓存中');
            count++;
            if (count === this.imgs.length) {
              console.log('全部加载完成');
            }
          } else {
            image.onload = () => {
              count++;
              if (count === this.imgs.length) {
                console.log('全部加载完成');
              }
            };
          }
        }
      }
    }
};

优点

  • 通过 Vue 组件的生命周期钩子来管理图片预加载,避免影响页面渲染。
  • 使用 new Image() 创建的图片对象不会直接渲染到页面上,因此不会影响页面布局。
  • 可以在组件创建时自动进行图片预加载,提升用户体验。

优化建议

当图片数量较多时,一次性预加载所有图片可能会影响性能,特别是对于移动设备或网络条件较差的用户。因此,可以结合懒加载(Lazy Loading)来提升用户体验。懒加载可以在图片进入视口(viewport)时才进行加载,从而提高初始页面加载速度和用户体验。

  • 懒加载实现

    • 使用loading="lazy"

    • 或者通过以下步骤来实现图片的懒加载:

      安装依赖:使用 Intersection Observer API 来检测图片是否进入视口。Vue 也有专门的懒加载库,如 vue-lazyload

      修改组件:在组件中使用懒加载逻辑。

总结

在 Vue 中实现图片预加载是一个简单而高效的过程,通常会通过生命周期钩子函数(如 created)来管理。你可以使用 new Image() 创建图片对象,设置其 src 属性来实现图片的预加载,减少后续访问时的等待时间。具体实现根据自己项目来写。

以上就是Vue使用new Image()实现图片预加载功能的详细内容,更多关于Vue new Image()图片预加载的资料请关注脚本之家其它相关文章!

相关文章

  • vue实现数字滚动效果

    vue实现数字滚动效果

    这篇文章主要为大家详细介绍了vue实现数字滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 分享一个基于Ace的Markdown编辑器

    分享一个基于Ace的Markdown编辑器

    相信开发中或多或少都会有使用md的时候。那么一个简易的md编辑器显得尤为重要,如果想要在自己的项目中添加一个md编辑器,那么不妨来看看这篇文章
    2021-10-10
  • vue3+vite实现低版本浏览器兼容的解决方案(出现白屏问题)

    vue3+vite实现低版本浏览器兼容的解决方案(出现白屏问题)

    项目全线使用vue3的时候,自然使用的是配套更加契合的vite打包工具,于是自然而然会用到很多新的语法,本文给大家介绍了vue3+vite实现低版本浏览器兼容的解决方案(出现白屏问题),需要的朋友可以参考下
    2024-04-04
  • vue中v-model对select的绑定操作

    vue中v-model对select的绑定操作

    这篇文章主要介绍了vue中v-model对select的绑定操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue实现在线预览office文件的示例代码

    vue实现在线预览office文件的示例代码

    本文主要介绍了vue实现在线预览office文件,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 解决vue-router进行build无法正常显示路由页面的问题

    解决vue-router进行build无法正常显示路由页面的问题

    下面小编就为大家分享一篇解决vue-router进行build无法正常显示路由页面的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • vue3 reactive响应式依赖收集派发更新原理解析

    vue3 reactive响应式依赖收集派发更新原理解析

    这篇文章主要为大家介绍了vue3响应式reactive依赖收集派发更新原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Vite+Vue3使用MockJS的实现示例

    Vite+Vue3使用MockJS的实现示例

    写一些纯前端的项目时,自己造数据有些麻烦,于是我们可以利用mock造一些简单的数据,来满足我们的需求,本文主要介绍了Vite+Vue3使用MockJS的实现示例,感兴趣的可以了解一下
    2024-01-01
  • vue3响应式Proxy与Reflect的理解及基本使用实例详解

    vue3响应式Proxy与Reflect的理解及基本使用实例详解

    这篇文章主要为大家介绍了vue3响应式Proxy与Reflect的理解及基本使用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Vue通过provide inject实现组件通信

    Vue通过provide inject实现组件通信

    这篇文章主要介绍了Vue通过provide inject实现组件通信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论