在vue中实现图片懒加载,并引入promise判断加载状态和优化

36 篇文章 0 订阅
订阅专栏

为什么需要懒加载?
答: 当你的一个网页,图片有几十张,上百张时,同时的加载,有可能会导致网页出现很长一段时间的空白,而且用户并不一定会浏览全部的图片,全部加载完,也会浪费用户的浏览,这样的体验是很不好的.

效果如图:
在这里插入图片描述
那么如何在vue项目中实现懒加载呢?

1.懒加载的原理
一张图片就是一个img标签,浏览器是根据src的属性发起图片请求的.那么我们实现的依据就是当前图片出现在可视屏幕上,就把图片的地址赋值(或替换)给img的src属性.

2.懒加载的实现步骤
2.1 默认loading图片
2.2 判断哪些需要加载(难点)
2.3 预缓存在浏览器
2.4 替换真图片

3.代码实现
3.1 默认loading图片
loading找一些1-2K的图片,越小越好,放置在本地assets目录即可

<template>
  <div class="img-loading-container" ref="imgBox">
    <img
      v-for="(item,index) in 5"
      :key="index"
      src="@/assets/loading.gif"
      alt=""
    >
  </div>
</template>

3.2 判断哪些需要加载
当图片进入可视区域时,应用网友的一张图
在这里插入图片描述
如上图所示, 当图片(指当前需要加载的图片)距离顶部的距离小于可视区域h和滚动区域高度s之和时说明图片进入可视化区域了,即top-height < s+h时,图片在可视区。
介绍用到的api函数:
网页被卷去的高: document.body.scrollTop;
可视区域高度: window.innerHeight
当前对象到浏览器顶部的距离: domObject.offsetTop

具体代码:

<script>
export default {
  data () {
    return {
      imgList: [
        {
          url: 'https://.../distribution-web/upLoad/img/ceshi/1.jpg'
        },
        {
          url: 'https://.../distribution-web/upLoad/img/ceshi/2.jpg'
        },
        {
          url: 'https://.../distribution-web/upLoad/img/ceshi/3.jpg'
        },
        {
          url: 'https://.../distribution-web/upLoad/img/ceshi/4.jp' // 这是故意写错的
        },
        {
          url: 'https://.../distribution-web/upLoad/img/ceshi/5.jpg'
        }
      ],
      present: {
        old: -1,
        new: 0
      }
    }
  },
  mounted () {
    // 进入当前页面就加载
    setTimeout(this.getImgList, 300)
    // 监听滚动事件
    window.addEventListener('scroll', this.getImgList)
  },
  methods: {
    getImageCache (imgNodes, id) {
      return new Promise((resolve, reject) => {
        // 创建一个image对象
        var temp = new Image();
        // 预先把加载的图片加入内存中(隐形加载),相当于给浏览器缓存了一张图片
        temp.src = this.imgList[id].url
        // 成功的状态
        temp.onload = () => {
          imgNodes[id].src = temp.src
          resolve('第' + (id + 1) + '张图片加载成功')        };
        // 失败的状态
        temp.onerror = () => reject('第' + (id + 1) + '张图片加载失败了');
      })
    },
    getImgList () {
      // 获取所有img的DOM对象
      const imgNodes = this.$refs.imgBox.childNodes
      // 可视区域高度
      const h = window.innerHeight;
      // 滚动区域高度
      const s = document.documentElement.scrollTop || document.body.scrollTop;

      for (let i = this.present.new; i < imgNodes.length; i++) {
        // 可视区域和滚动区域之和时懒加载大于图片距离顶部的距离
        if ((h + s) > imgNodes[i].offsetTop) {
          // 已加载的最大下标赋值给present做记录,防止再循环
          this.present.new = i
          // 当加载的最大下标值和上一次的下标值相等时,防止再请求
          if (this.present.old !== this.present.new) {
            this.getImageCache(imgNodes, i).then((success) => {
              console.log(success)
            }).catch((error) => {
              console.log(error)
              imgNodes[i].src = require('@/assets/error.jpg')
            })
            // 把当前最大下标值赋值给上一次最大下标值
            this.present.old = this.present.new
          }
        }
      }
    }
  }
}
</script>

你们可能会遇到的问题(因为我遇到过…)
1.当图片的height的数值设置为auto时,你会发现domObject.offsetTop(当前对象到浏览器顶部的距离)的值很小,然后你用domObject.offsetHeight(获取dom对象的高度)发现值为0!,解决方法有加个一次性计时器,还有就是放置在temp.onload中
2. 当你运用我的代码,打开浏览器的调试network时,每一张图片居然会加载两次或者很多次! 你再仔细看看你加载图片的Request Headers的两个属性,分别是cache-control和pragma。 他们的值都为no-cache(禁止缓存),这就是你浏览器的设置问题了,你在Disable cache打了勾,去掉就行了,如图
在这里插入图片描述

**最后:**本文章参考了tomorrownan的博客,后根据自己的思路,改造成vue的写法和加入promise,及把遇到的问题(已解决)分享给大家。

Java对图片懒加载_记录基于promise实现图片懒加载优化性能
weixin_34061241的博客
02-25 316
一、场景项目最近要求对视频进行截图保存、查看,由于项目是公安方面的,导致一天一个控制台会生成很多图片,查看肇事图片的时候,页面一次加载过多导致全部渲染速度很慢,体验不好,于是基于网上现有资料和自己的实践,总结了在项目的应用。二、实现过程1、首先先给img标签src 赋值为loading图片地址,然后添加一个真实要get的图片地址像下面一样src="./image/loading.jpg"alt=...
Vue实现一个简单的瀑布流组件(包含图片懒加载功能)
qq_45752104的博客
06-25 2588
日常业务需求经常会使用到瀑布流布局,在实现瀑布流布局时,总体上的思路是:将页面等分为一定的列数,计算出最短的一列,然后将需要放入的元素放入最短的一列,重复以上步骤,直到最后将所有元素放入列。 总体来数,瀑布流布局的计算步骤比较复杂,同时还需要考虑上拉刷新等情况,为了减少重复的工作量,可以创建一个瀑布流的组件,后续在开发时只需要关注每一个元素的布局,而无需考虑瀑布流的实现,从而大大的减少工作量。 实现效果: 组件使用示例 // 引入组件 import waterfall from '@com/wate
Vue回炉重造之图片加载性能优化
主要领域:前端开发
04-16 6082
前言 图片加载优化对于一个网站性能好坏起着至关重要的作用。所以我们使用Vue来操作一波。 备注 以下的优化一、优化二栏目都是我自己封装在Vue的工具函数里,所以请认真看完,要不然直接复制的话,容易出错的。 资源 Vue.js Element UI 优化一:图片加载动画 只有当图片加载完成后才可以显示图片加载动画结束。我们使用Element UI的loading组件来用作加载的动画。假设一个...
Promise实现多图预加载
weixin_34121282的博客
06-09 247
Promise正如它的文意思“承诺”一样,保存着未来会发生事件(一般为异步操作)。Promise避免了“回调地狱”,写法更加接近同步操作。说到同步,我更加喜欢async、await,它们书写更贴近同步操作。 图片加载往往是异步的,如果有操作需要等到所有的图片加载完之后再执行,这时候就需要不断的监听所有图片加载情况。 ES5 利用ES5实现多图预加载,可以通过计数器判断有多少图片加载完成。...
Promiset图片懒加载
A_wait_for的博客
11-14 241
图片懒加载
vue3使用图片懒加载(性能优化
头条:俊哥前端工程师,真正的大师永远怀揣着一颗学徒的心。
12-08 2647
图片懒加载(Lazy Loading)是一种延迟加载图片的技术,它只有在图片即将进入浏览器可视区域时才加载图片,从而减少页面初始加载时间和提高页面加载性能。
vue实现路由懒加载及组件懒加载的方式
10-16
本文将详细介绍如何在Vue.js项目实现路由和组件的懒加载。 首先,让我们理解什么是懒加载。懒加载是一种编程技术,指的是在实际需要某个资源之前不去加载它,而是在需要使用时才去获取。在网页应用,这意味着将...
VUE实现文件下载并判断状态的方法
10-16
Vue.js框架实现文件下载并判断下载状态是常见的需求,特别是在处理用户交互和数据传输时。本篇文章将详细介绍如何在Vue项目实现这一功能,并通过Axios库来管理HTTP请求。 首先,我们需要引入Axios库,它是...
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
10-15
在这个教程,我们将探讨如何使用Vue实现一个包含网络图片瀑布流、下拉刷新和上拉加载更多功能的组件。首先,我们需要理解瀑布流布局的基本概念,它是通过绝对定位使得元素按列排列,形成一种自适应的网格效果。 1...
vue src动态加载请求获取图片的方法
10-17
动态加载本地图片和请求获取的图片Vue都是通过`src`属性与数据绑定实现的。对于本地图片,我们可以使用`require`关键字引入;对于请求获取的图片,我们需要配置Webpack来处理图片文件,并在获取数据后将图片URL...
Promise异步加载图片
远方
12-01 2335
function loadImageAsync(url){ return new Promise((resolve,reject)=&amp;gt;{ let image=new Image(); image.onload=function(){ resolve(image); }; image.onerror=function(){ reject(new Error('Co...
Vue如何进行响应式图像与图片懒加载优化
u013749113的博客
10-05 890
Vue实现响应式图像和图片懒加载优化是提高网站性能和用户体验的关键步骤。通过绑定图像的src属性和使用计算属性,您可以创建响应式图像,使其适应不同的用户设备。而使用Vue-Lazyload库,您可以轻松地实现图片懒加载,延迟加载页面上的图像,提高页面加载性能。通过合理使用这些技术,您可以改善您的Vue应用程序的图像加载性能,为用户提供更好的体验。希望这篇文章对您有所帮助,如果您有任何问题或需要进一步的指导,请随时提问。
手写一个简易的用 Promise 加载一张图片
lovexiaoqiu的博客
06-17 338
function loadImg(src){ return new Promise((resove,reject)=>{ const img = document.createElement('img') img.onload = ()=>{ resove(img) } img.onerror = ()=>{ let err = new Error('图片加载失败') .
Promise.all加载多张图片
Andy
03-15 727
Promise.all加载多张图片
使用Promise对象封装图片加载的异步操作
jyn15159的博客
05-31 356
使用Promise对象封装图片加载的异步操作。如果加载成功,就调用resolve方法,否则就调用reject方法。
es6学习第3天,...的几种用法 vue-lazyload图片懒加载 Promise校验
Sukla的博客
11-24 1008
1,箭头函数  只有一条语句的时候 不用加花括号  function(a){return a+b} 相当于 a=>a+b 有多个参数的时候 要加上圆括号 (a,b)=>a+b 有多条语句的时候 要加上花括号 (a,b)=>{ a=c; return a+b } 2,... 的用法  3,...和参数放到一起的时候 表示将未知个数的参数 放到数组 m f(...m){
vue图片懒加载的两种方法
Humor_L的博客
05-30 63
综上所述,使用第三方库vue-lazyload适合简单的图片懒加载需求,可以快速实现并且具有较好的可定制性;如果你希望有更多的自定义和灵活性,可以使用Intersection Observer API来实现图片懒加载。如果你希望快速实现图片懒加载功能,而不想自己编写复杂的逻辑和处理细节,可以选择使用vue-lazyload。简单易用,只需要在main.js配置一次,然后在组件使用v-lazy指令即可实现图片懒加载。需要编写更多的代码来实现加载逻辑,相对于使用第三方库来说,实现起来可能更复杂一些。
vue的一些优化方式,web开发学习过程
2401_84140130的博客
04-11 601
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)[外链图片转存…(img-yvR6lRRK-1712778843322)][外链图片转存…(img-EAx065YY-1712778843322)]
vue img src 动态赋值_解决vue-pdf查看pdf文件及打印乱码的问题_vue.js
weixin_39689347的博客
11-04 732
前言vue简单使用vue-pdf预览pdf文件,解决打印预览乱码问题vue-pdf 使用安装npm install --save vue-pdf引入import pdf from "vue-pdf自定义封装pdf预览组件 <template> <el-dialog :"pdfDialog" :close-on-click-modal="false" :s...
vue使用echarts绘制树形图并实现加载
最新发布
09-28
Vue.js使用ECharts绘制树形图并实现加载,通常需要以下几个步骤: 1. **安装依赖**: 首先,在项目引入ECharts库和相关的Vue组件。你可以通过npm或yarn添加`echarts-for-vue`包: ```bash npm install ...
50
原创
98
点赞
342
收藏
35
粉丝
关注
私信
写文章

热门文章

  • yarn的安装和使用,并配置用户环境变量 21711
  • 广东移动UNT401H南传通过adb装当贝桌面 19733
  • uni-app整合最新版vant-weapp,遇到的问题和解决办法 15568
  • vue+elementUI+表格,实现输入框失去焦点获取当前id和当前输入框改变的内容 15245
  • 在html中使用import遇到的问题 15101

分类专栏

  • 前端开发 36篇
  • 技巧 1篇
  • 后端开发 2篇
  • 小程序开发 4篇
  • 环境配置 3篇
  • 网络运维 4篇
  • 笔记 1篇

最新评论

  • uni-app整合最新版vant-weapp,遇到的问题和解决办法

    虚妄狼: 没有list组件吗?

  • 广东移动UNT401H南传通过adb装当贝桌面

    2401_83828519: 打开ADB要输入验证吗,验证码是啥

  • vue中,本地图片路径写到js中,图片不显示问题

    巧宝er: 有用,原来是错在这里。一直在找问题。请问为什么要这么写呢?

  • 使用vh,vw配合媒体查询做pc端的界面自适应

    竹月先生: vue2项目也是这个插件吗

  • express-generator脚手架,引入babel,支持import和async,绝对可用

    Mei_Tou_Nao_: 太棒啦,我愁了好久终于解决了

最新文章

  • Ant Design Vue组件库,下拉框内容与select分离的问题
  • 在html中使用import遇到的问题
  • 宝塔面板安装Pure-Ftpd,但ftp无法建立连接问题
2021年1篇
2020年22篇
2019年27篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司旅游网站结构优化天津广电网站优化检修seo网站优化价格是多少钱烟台优化网站建设江门网站优化费用多少如何完成网站站点结构优化网站优化搜索引擎优化网站结构目录的优化技巧网站静态资源优化南阳官网seo网站优化工具如何优化网站数据库雅安网站优化性价比高宁津网站优化seo罗源网站seo优化推广网站教程优化整站长春电商网站优化方案南开网站优化怎么样宁波关键词网站优化公司怎样看出网站是整站优化的均安网站优化托管人工优化网站推广按词优化网站推荐如何进行网站优化网站seo优化怎么样国互网如何优化网站便宜网站建设网站排名优化公司陆丰网站优化公司武威网站优化推广公司哪家好越秀区网站优化哪家有名深圳网站优化托管效果香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化