`

Vue自定义图片懒加载指令v-lazyload详解

 
阅读更多

Vue是可以自定义指令的,最近学习过程中遇见了一个需要图片懒加载的功能,最后参考了别人的代码和思路自己重新写了一遍。以下将详细介绍如何实现自定义指令v-lazyload。

先看如何使用这个指令:  

1
<img v-lazyload="imageSrc" >

imageSrc是要加载的图片的实际路径。

为了实现这个指令,我们首先单独建立一个文件,名字为lazyload.js.并填写基本的代码,如下:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Vue 图片懒加载,导出模块
export default (Vue , options = {})=>{
  //初始化的选项,default是未加载图片时显示的默认图片
  var init = {
  }
  //addListener为Vue指令的具体实现功能函数,我们这里为所有使用v-lazyload的指令的元素添加监听
  //ele 是dom元素,binding是绑定的具体值,
  //例如:<img v-lazyload="imageSrc" > ele是img binding是imageSrc
  const addListenner = (ele,binding) =>{
    
  }
  //Vue自定义指令,lazyload为指令的名称
  Vue.directive('lazyload',{
    inserted:addListener,
    updated:addListener
  })
}

inserted 和 updated为Vue指令的执行不同阶段提供的钩子函数,查看Vue的官网可以看到一共有5个阶段, 

指令定义函数提供了几个钩子函数(可选):

bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。

inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。

update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。

componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。

unbind: 只调用一次, 指令与元素解绑时调用。

这里我们只用inserted和updated就够了。

  接下来我们具体实现addListener的实现。我们的具体思路如下:

  1、先看看这个图片是否需要懒加载。有两种情况,一是图片还没到达可视区域,二是图片已经加载过了。

  2、然后监听窗口的scroll事件,判断哪些图片可以进行懒加载了。

  这里我们需要一个需要进行监听需要懒加载的图片列表和一个需要记录已经加载过得图片列表。另外为了方便数组的操作,我们加一个数组的remove方法。

继续我们的代码。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//Vue 图片懒加载
export default (Vue , options = {})=>{
  
  //数组item remove方法
  if(!Array.prototype.remove){
    Array.prototype.remove = function(item){
      if(!this.length) return
      var index = this.indexOf(item);
      if( index > -1){
        this.splice(index,1);
        return this
      }
    }
  }
  var init = {   
  }  
  //需要进行监听的图片列表,还没有加载过得
  var listenList = [];
  //已经加载过得图片缓存列表
  var imageCatcheList = [];
  //是否已经加载过了
  const isAlredyLoad = (imageSrc) => {
     
  }
  //检测图片是否可以加载,如果可以则进行加载
  const isCanShow = (item) =>{
     
  };
  //添加监听事件scroll
  const onListenScroll = () =>{
     
  }
  //Vue 指令最终的方法
  const addListener = (ele,binding) =>{
    //绑定的图片地址
    var imageSrc = binding.value;
    //如果已经加载过,则无需重新加载,直接将src赋值
    if(isAlredyLoad(imageSrc)){
      ele.src = imageSrc;
      return false;
    }
    var item = {
      ele:ele,
      src:imageSrc
    }
    //图片显示默认的图片
    ele.src = init.default;
    //再看看是否可以显示此图片
    if(isCanShow(item)){
      return
    }
    //否则将图片地址和元素均放入监听的lisenList里
    listenList.push(item);
     
    //然后开始监听页面scroll事件
    onListenScroll();
  }
 
  Vue.directive('lazyload',{
    inserted:addListener,
    updated:addListener
  })
}

接下来就几个空方法的实现了。

isAlredyLoad ,判断是否已经加载过了这个图片

1
2
3
4
5
6
7
const isAlredyLoad = (imageSrc) => {
    if(imageCatcheList.indexOf(imageSrc) > -1){
      return true;
    }else{
      return false;
    }
  }

isCanShow 图片是否进入可视区域,如果已经进入则进行加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//检测图片是否可以加载,如果可以则进行加载
  const isCanShow = (item) =>{
    var ele = item.ele;
    var src = item.src;
    //图片距离页面顶部的距离
    var top = ele.getBoundingClientRect().top;
    //页面可视区域的高度
    var windowHeight = window.innerHight;
    //top + 10 已经进入了可视区域10像素
    if(top + 10 < window.innerHeight){
      var image = new Image();
      image.src = src;
      image.onload = function(){
        ele.src = src;
        imageCatcheList.push(src);
        listenList.remove(item);
      }
      return true;
    }else{
      return false;
    }
  };

onListenScroll监听滚动事件,并且检测是否进入可视区域。

1
2
3
4
5
6
7
8
const onListenScroll = () =>{
    window.addEventListener('scroll',function(){
      var length = listenList.length;
      for(let i = 0;i<length;i++ ){
        isCanShow(listenList[i]);
      }
    })
  }

最终我们的代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//Vue 图片懒加载
export default (Vue , options = {})=>{
  if(!Array.prototype.remove){
    Array.prototype.remove = function(item){
      if(!this.length) return
      var index = this.indexOf(item);
      if( index > -1){
        this.splice(index,1);
        return this
      }
    }
  }
  var init = {
    lazyLoad: false,
  }
 
  var listenList = [];
  var imageCatcheList = [];
 
  const isAlredyLoad = (imageSrc) => {
    if(imageCatcheList.indexOf(imageSrc) > -1){
      return true;
    }else{
      return false;
    }
  }
  //检测图片是否可以加载,如果可以则进行加载
  const isCanShow = (item) =>{
    var ele = item.ele;
    var src = item.src;
    //图片距离页面顶部的距离
    var top = ele.getBoundingClientRect().top;
    //页面可视区域的高度
    var windowHeight = window.innerHight;
    //top + 10 已经进入了可视区域10像素
    if(top + 10 < window.innerHeight){
      var image = new Image();
      image.src = src;
      image.onload = function(){
        ele.src = src;
        imageCatcheList.push(src);
        listenList.remove(item);
      }
      return true;
    }else{
      return false;
    }
  };
 
  const onListenScroll = () =>{
    window.addEventListener('scroll',function(){
      var length = listenList.length;
      for(let i = 0;i<length;i++ ){
        isCanShow(listenList[i]);
      }
    })
  }
  //Vue 指令最终的方法
  const addListener = (ele,binding) =>{
    //绑定的图片地址
    var imageSrc = binding.value;
    //如果已经加载过,则无需重新加载,直接将src赋值
    if(isAlredyLoad(imageSrc)){
      ele.src = imageSrc;
      return false;
    }
    var item = {
      ele:ele,
      src:imageSrc
    }
    //图片显示默认的图片
    ele.src = init.default;
    //再看看是否可以显示此图片
    if(isCanShow(item)){
      return
    }
    //否则将图片地址和元素均放入监听的lisenList里
    listenList.push(item);
     
    //然后开始监听页面scroll事件
    onListenScroll();
  }
 
  Vue.directive('lazyload',{
    inserted:addListener,
    updated:addListener
  })
}

使用时需要在主文件中引入这个文件,并且vue.use();

1
2
import LazyLoad from 'lazyLoad.js'
Vue.use(LazyLoad);

并且在需要懒加载的图片上均按照如下使用v-lazyload指令即可

<img v-lazyload="imageSrc" >

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

分享到:
评论

相关推荐

    前端项目-vue-lazyload.zip

    Vue-lazyload 就是一个专为 Vue.js 应用程序设计的插件,它允许我们按需加载图片,从而提高应用性能。 Vue-lazyload 插件主要解决了以下问题: 1. **减少网络资源请求**:传统方式下,所有图片都会在页面加载时...

    浅谈vue中使用图片懒加载vue-lazyload插件详细指南

    这里的`v-lazy`指令的值是图片的URL,它会告诉`vue-lazyload`何时加载图片。 **配置选项** `vue-lazyload`提供了多种配置选项,以便根据项目需求进行定制: 1. `preLoad`:预加载比例,默认为1.3,表示在图片实际...

    vue自定义图片懒加载指令

    vue中封装自定义指令,该指令主要功能是到达指定区域加载图片,若已加载过就不再加载

    vue-lazyload使用总结(推荐)

    Vue-Lazyload是一款在Vue.js项目中常用的图片懒加载插件。它可以帮助开发者优化网页性能,减少页面初次加载时的数据量,从而提升用户体验。在Vue项目中,当用户滚动页面时,Vue-Lazyload会自动加载可视区域内的图片...

    Vue模块用于在vuejs应用中懒加图片

    Vue-Lazyload 插件允许我们在 Vue 应用中按需加载图片,即只有当图片进入视口时,才会发起请求加载图片,这样可以显著减少初次加载页面时的数据量,从而加快页面初始化速度。对于拥有大量图片或者图片资源较大的网页...

    Node.js-一个组件实现lazyload图片当在视窗内(或附近)时才加载

    总结起来,这个"Node.js-一个组件实现lazyload图片当在视窗内(或附近)时才加载"的主题,实质上是关于如何利用React和Intersection Observer API在前端实现图片懒加载,以提升网页性能。通过这样的技术,我们可以在不...

    vue-lazyload-source-code:学习vue-lazyload源代码-vue source code

    $ npm i vue-lazyload -S CDN CDN: : &lt; script src =" https://unpkg.com/vue-lazyload/vue-lazyload.js " &gt; &lt;/ script &gt; &lt; script &gt; Vue . use ( VueLazyload ) . . . &lt;/ script &gt; ...

    基于vue的懒加载插件实现图片或者其他资源进入可视区域后加载

    除了`vue-lazyload`,还有其他类似的Vue懒加载插件,如`vue-virtual-scroller`,它不仅支持图片懒加载,还提供了虚拟滚动功能,进一步提高了性能。选择适合项目的懒加载解决方案,能够显著提升用户体验,降低服务器...

    vue-lazyload, 在你的应用程序中,你的图像或者组件的一个 Vue.js 插件.zip

    vue-lazyload, 在你的应用程序中,你的图像或者组件的一个 Vue.js 插件 lazyload 用于应用程序中lazyloading图像的Vue模块。 这个项目的一些目标值得注意:轻巧,功能强大,易于使用处理任何图像类型加载图像时添加...

    lazyload异步加载图片

    **懒加载(Lazy Load)异步加载图片技术详解** 懒加载是一种优化网页性能的技术,它主要应用于图片或者视频等大体积资源的加载。在网页初次加载时,只加载视口内的图片,当用户滚动页面,即将进入视口的图片才会被...

    浅谈vue-lazyload实现的详细过程

    本文介绍了浅谈vue-lazyload实现的详细过程,分享给大家,也给自己留个笔记 首先 ,在命令行输入npm install vue-lazyload&&cnpm install vue-lazyload 然后,在main.js里引入这个模块。 import 'VueLazyload' from ...

    vue-l-lazyload:Vue.js v2.x +的lazyload插件

    vue-l-lazyload Vue.js v2.x +的惰性加载和视图内检测插件。 演示版 或npm install vue-l-lazyload && npm run startDev进行播放! 拉请求是受欢迎的:) 执照 LGPL-V3 特征 除了Vue外,没有其他依赖项 渐进式配置 ...

    vue-tiny-lazyload-img-用于延迟加载图像的小尺寸Vue.js v.2 +指令-Vue.js开发

    ue vue-tiny-lazyload-img一个小尺寸的Vue.js指令,用于使用IntersectionObserver API演示页延迟加载图像https://mazipan.github.io/vue-:snail:vue-tiny-lazyload-img一个小尺寸的Vue.js使用IntersectionObserver ...

    vue指令实现页面图片懒加载鼠标滚动图片开始加载

    Vue 指令是Vue.js框架提供的一种自定义行为方式,通过创建自定义指令,我们可以实现图片懒加载功能,即当图片进入浏览器视口时才开始加载,这样可以有效地节省带宽,提高页面的加载速度。 图片懒加载的核心原理在于...

    vue-lazyload:一个Vue.js插件,用于在应用程序中延迟加载图像或组件

    $ npm i vue-lazyload -S 纱 $ yarn add vue-lazyload CDN CDN: : &lt; script src =" https://unpkg.com/vue-lazyload/vue-lazyload.js " &gt; &lt;/ script &gt; &lt; script &gt; Vue . use ( VueLa

    基于Vue的延迟加载插件vue-view-lazy

    懒加载图片可以使用v-view-lazy指令来实现,例如:图片" v-view-lazy="item.src"&gt;。懒加载数据可以使用v-view-lazy指令并结合@model事件来实现,例如:&lt;div v-for="(v,i) in msg" :key="i" v-view-lazy @model="(e)=...

    vue自定义指令-实现div和图片的拖拽,放大,缩小

    vue自定义指令--实现div和图片的拖拽,放大,缩小,已封装成组件,下来导入后可直接使用

Global site tag (gtag.js) - Google Analytics