我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue-lazyload 图片懒加载- 实践与源码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue-lazyload 图片懒加载- 实践与源码

  • 基础知识要夯实;
  • 原理源码要深入;
  • 深度广度要扩展;

vue-lazyload 解决了什么问题?(项目常用)

可以想象一个网页打开有成百上千的图片需要加载,页面会变得非常的卡顿,此时如果只是可视区域的图片加载,其他的图片可以暂时有一个占位loading图,等滚动它们到可视区域时再去请求真实图片并且替换就好了。很好,vue-lazyload插件就是解决此类问题的。

vue-lazyload 图片懒加载- 实践

一、安装插件

vue-lazyload官网npm配置地址(重要)

https://www.npmjs.com/package/vue-lazyload

  1. npm i vue-lazyload --save 

二、配置插件

在main.js 文件中 引入 vue-lazyload 的插件。 (全局)

最外层static目录下的图片引用

  1. import VueLazyLoad from 'vue-lazyload'
  2.  
  3. // 最外层static目录下的图片引用 
  4. Vue.use(VueLazyLoad, { 
  5.   error: '/static/images/defaultAvatar.png', // 此处是图片加载失败时候 显示的图片 
  6.   loading: '/static/images/defaultAvatar.png', // 此处是图片加载中 显示的图片 
  7.   attempt: 1, // 加载一屏图片 
  8.   preLoad: 1, // 失败尝试次数 
  9. }); 

class="lazy" data-src下的assets目录下的图片

  1. import VueLazyLoad from 'vue-lazyload'
  2.  
  3. // class="lazy" data-src下的assets目录下的图片 
  4. Vue.use(VueLazyLoad, { 
  5.   error: require('common/assets/defaultAvatar.png'), // 此处是图片加载失败时候 显示的图片 
  6.   loading: require('common/assets/defaultAvatar.png'), // 此处是图片加载中 显示的图片 
  7.   attempt: 1, // 加载一屏图片 
  8.   preLoad: 1, // 失败尝试次数 
  9. }); 

*项目使用遇到问题,说明:

import VueLazyLoad from 'vue-lazyload';

报错:Absolute imports should come before relative imports.

原因:主要是引入文件的位置问题。

三、使用插件

只需要在动态请求img 路径 把原本的 :scr="url", 替换为 v-lazy="url" 接下来,再去看看效果实例。

  1. "talent.cover_url" :key="talent.cover_url"  class="picclass="lazy" data-src" > 

说明:

选项卡模式的图片列表,每次点击切换时候,会请求不同数量,不同的图片内容。然而发现 列表中的前几个图片,无论怎么来回切换,每次都显示最开始的图片。

这个时候 解决办法是 在img 里面 加上 :key="url" 就可以解决这个bug;

四、项目需求:不同模块选择不同的图片 (局部)

vue-lazyload插件如何做不同模块选择不同的loading图片(通过样式进行设置)

  1. import VueLazyLoad from 'vue-lazyload'
  2.  
  3. // 最外层static目录下的图片引用 
  4. Vue.use(VueLazyLoad, { 
  5.   // error: '/static/images/defaultAvatar.png', // 此处是图片加载失败时候 显示的图片 
  6.   // loading: '/static/images/defaultAvatar.png', // 此处是图片加载中 显示的图片 
  7.   // attempt: 1, // 加载一屏图片 
  8.   // preLoad: 1, // 失败尝试次数 
  9. }); 
  10.  
  11. // 图片加载中、加载结束、或者加载错误三种状态 
  12.   

注意:全局与局部是单独设置的,全局的优先级高。

五、构造函数选项


vue-lazyload 图片懒加载- 源码

一、原理剖析

lazyload的主要流程的流程图


原理简述:

1)vue-lazyload是通过指令的方式实现的,定义的指令是v-lazy指令;

2)指令被bind时会创建一个listener,并将其添加到listener queue里面, 并且搜索target dom节点,为其注册dom事件(如scroll事件);

3)上面的dom事件回调中,会遍历 listener queue里的listener,判断此listener绑定的dom是否处于页面中perload的位置,如果处于则加载异步加载当前图片的资源;

4)同时listener会在当前图片加载的过程的loading,loaded,error三种状态触发当前dom渲染的函数,分别渲染三种状态下dom的内容;

二、源码解析:

在组件install安装时,调用LazyClass返回了一个class对象,然后创建了一个class实例。

其核心是lazyLoadHandler()函数,是经过节流函数处理的图片加载的入口函数。

  1. this.lazyLoadHandler = throttle(() => { 
  2.   let catIn = false 
  3.   this.ListenerQueue.forEach(listener => { 
  4.     if (listener.state.loaded) return 
  5.     catIn = listener.checkInView() 
  6.     catIn && listener.load() 
  7.   }) 
  8. }, 200) 
  9. checkInView () {  
  10.   this.getRect() // 调用dom的getBoundingClientRect() 
  11.   return (this.rect.top < window.innerHeight * this.options.preLoad && this.rect.bottom > this.options.preLoadTop) && 
  12.         (this.rect.left < window.innerWidth * this.options.preLoad && this.rect.right > 0) 
  13.   // 判断dom的顶部是否到了preload的位置,判断dom的底部是否到达了preload的位置,X轴同理。 

主要操作:找到对应的target(用于注册dom事件的dom节点;比如:页面滚动的dom节点),为其注册dom事件;为当前dom创建Listenr并添加到listener queue中。最后用lazyLoadHandler()函数,加载图片。

当满足条件,调用load()函数异步加载图片。

  1. load () { 
  2.     // 如果当前尝试加载图片的次数大于指定的次数, 并且当前状态还是错误的, 停止加载动作 
  3.     if ((this.attempt > this.options.attempt - 1) && this.state.error) { 
  4.         if (!this.options.silent) console.log('error end'
  5.         return 
  6.     } 
  7.  
  8.     if (this.state.loaded || imageCache[this.class="lazy" data-src]) { //如果已缓存 
  9.         return this.render('loaded'true) // 使用缓存渲染图片 
  10.     } 
  11.  
  12.     this.render('loading'false) // 调用lazy中的 elRender()函数, 用户切换img的class="lazy" data-src显示数据,并触发相应的状态的回调函数 
  13.  
  14.     this.attempt++ // 尝试次数累加 
  15.  
  16.     this.record('loadStart') // 记录当前状态的时间 
  17.  
  18.     // 异步加载图片, 使用Image对象实现 
  19.     loadImageAsync({ 
  20.         class="lazy" data-src: this.class="lazy" data-src 
  21.     }, data => { 
  22.         this.naturalHeight = data.naturalHeight 
  23.         this.naturalWidth = data.naturalWidth 
  24.         this.state.loaded = true 
  25.         this.state.error = false 
  26.         this.record('loadEnd'
  27.         this.render('loaded'false) // 渲染 loaded状态的 dom的内容 
  28.         imageCache[this.class="lazy" data-src] = 1 // 当前图片缓存在浏览器里面了 
  29.     }, err => { 
  30.         this.state.error = true 
  31.         this.state.loaded = false 
  32.         this.render('error'false
  33.     }) 

loadImageAsync异步加载图片方法,通过image对象实现的网络请求。

  1. const loadImageAsync = (item, resolve, reject) => { 
  2.     let image = new Image() 
  3.     image.class="lazy" data-src = item.class="lazy" data-src 
  4.  
  5.     image.onload = function () { 
  6.         resolve({ 
  7.             naturalHeight: image.naturalHeight, // 图片的 实际高度 
  8.             naturalWidth: image.naturalWidth, 
  9.             class="lazy" data-src: image.class="lazy" data-src 
  10.         }) 
  11.     } 
  12.  
  13.     image.onerror = function (e) { 
  14.         reject(e) 
  15.     } 

lazy class的update()函数,也就是v-lazy指令绑定的数据发生改变的时候出发的回调函数。

  1. update (el, binding) { // 获取当前dom绑定的 图片class="lazy" data-src的数据, 如果当前dom执行过load过程, 重置当前dom的图片数据和状态 
  2.   let { class="lazy" data-src, loading, error } = this.valueFormatter(binding.value) // 当前绑定的value是 obj, 从中选取{class="lazy" data-src, loading, error}; 是string, 则用作class="lazy" data-src 
  3.   // 找到当前dom绑定的listener 
  4.   const exist = find(this.ListenerQueue, item => item.el === el) 
  5.   // 更新listener的状态和状态对应的图片资源 
  6.   exist && exist.update({ 
  7.       class="lazy" data-src, 
  8.       loading, 
  9.       error 
  10.   }) 
  11.   this.lazyLoadHandler() 
  12.   Vue.nextTick(() => this.lazyLoadHandler()) 

 【编辑推荐】

  1. 5分钟让你理解K8S必备架构概念,以及网络模型
  2. 92年百度程序员被抓,给我们警示什么?
  3. 开源云盘利器:Nextcloud 21私有云盘搭建
  4. 更纯净,微软 Windows10 21H2 重大更新将减少系统臃肿软件数量
  5. 996工作制究竟是好是坏?

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue-lazyload 图片懒加载- 实践与源码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue-lazyload 图片懒加载- 实践与源码

可以想象一个网页打开有成百上千的图片需要加载,页面会变得非常的卡顿,此时如果只是可视区域的图片加载,其他的图片可以暂时有一个占位loading图,等滚动它们到可视区域时再去请求真实图片并且替换就好了。很好,vue-lazyload插件就是解

Vue中lazyload图片懒加载得示例分析

这篇文章主要介绍Vue中lazyload图片懒加载得示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.安装cnpm i vue-lazyload -S或npm i vue-lazyload -S2.实例导入配
2023-06-22

VUE懒加载实战教程:让你快速掌握图片懒加载技术

VUE懒加载技术是一种图片加载优化技术,可以有效提高网站的加载速度和用户体验。本文将介绍VUE懒加载的原理、实现方法和使用技巧,帮助你快速掌握图片懒加载技术。
VUE懒加载实战教程:让你快速掌握图片懒加载技术
2024-02-13

怎么用vue代码实现图片加载与显示默认图片

这篇文章主要讲解了“怎么用vue代码实现图片加载与显示默认图片”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用vue代码实现图片加载与显示默认图片”吧!HTML:
2023-07-04

VUE懒加载技术剖析,只用3行代码解决百万级图片加载难题

VUE懒加载技术是一种先进的图片加载技术,它可以将图片的加载延迟到需要的时候才进行,从而提高页面的加载速度和性能。只需要3行代码,就可以轻松解决百万级图片的加载难题。
VUE懒加载技术剖析,只用3行代码解决百万级图片加载难题
2024-02-13

前端图片懒加载的原理与3种实现方式举例

图片懒加载又称图片延时加载、惰性加载,即在用户需要使用图片的时候加载,这样可以减少请求,节省带宽,提高页面加载速度,相对的,也能减少服务器压力,下面这篇文章主要给大家介绍了关于前端图片懒加载的原理与3种实现方式的相关资料,需要的朋友可以参考下
2023-03-01

web前端图片懒加载的原理与实现方式有哪些

这篇文章主要讲解了“web前端图片懒加载的原理与实现方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“web前端图片懒加载的原理与实现方式有哪些”吧!一. 图片懒加载的目的大型网站如常
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录