全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

先看如何使用这个指令:  

<img v-lazyload="imageSrc" >

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

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

//Vue 图片懒加载,导出模块
export default (Vue , options = {})=>{
  //初始化的选项,default是未加载图片时显示的默认图片
 var init = {
    default: 'https://gw.alicdn.com/tps/i1/TB147JCLFXXXXc1XVXXxGsw1VXX-112-168.png'
 }
  //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方法。

继续我们的代码。

//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 = {   
    default: 'https://gw.alicdn.com/tps/i1/TB147JCLFXXXXc1XVXXxGsw1VXX-112-168.png' 
  }  
  //需要进行监听的图片列表,还没有加载过得 
  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 ,判断是否已经加载过了这个图片

const isAlredyLoad = (imageSrc) => {
  if(imageCatcheList.indexOf(imageSrc) > -1){
   return true;
  }else{
   return false;
  }
 }

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

//检测图片是否可以加载,如果可以则进行加载
 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监听滚动事件,并且检测是否进入可视区域。

const onListenScroll = () =>{
  window.addEventListener('scroll',function(){
   var length = listenList.length;
   for(let i = 0;i<length;i++ ){
    isCanShow(listenList[i]);
   }
  })
 }

最终我们的代码如下:

//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,
   default: 'https://gw.alicdn.com/tps/i1/TB147JCLFXXXXc1XVXXxGsw1VXX-112-168.png'
 }

 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();

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


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

<img v-lazyload="imageSrc" >

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


# Vue图片懒加载指令  # Vue懒加载  # v  # lazyload  # 分享一个精简的vue.js 图片lazyload插件实例  # 浅谈vue-lazyload实现的详细过程  # 浅谈vue中使用图片懒加载vue-lazyload插件详细指南  # vue-lazyload图片延迟加载插件的实例讲解  # vue-lazyload使用总结(推荐)  # Vue lazyload图片懒加载实例详解  # JS图片懒加载库VueLazyLoad详解  # vue通过vue-lazyload实现图片懒加载的代码详解  # Vue图片懒加载之Vue-Lazyload的使用  # 加载  # 绑定  # 过了  # 自定义  # 过得  # 几个  # 再看看  # 则将  # 定值  # 还没  # 一是  # 要在  # 一遍  # 可以看到  # 写了  # 详细介绍  # 可选  # 有两种  # 建立一个  # 先看 


相关文章: 如何获取上海专业网站定制建站电话?  广州营销型建站服务商推荐:技术优势与SEO优化解析  自助网站制作软件,个人如何自助建网站?  定制建站策划方案_专业建站与网站建设方案一站式指南  Android滚轮选择时间控件使用详解  深圳网站制作的公司有哪些,dido官方网站?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  网站按钮制作软件,如何实现网页中按钮的自动点击?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  Java解压缩zip - 解压缩多个文件或文件夹实例  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何通过虚拟主机快速完成网站搭建?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  如何在腾讯云免费申请建站?  制作网站的软件免费下载,免费制作app哪个平台好?  安云自助建站系统如何快速提升SEO排名?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  MySQL查询结果复制到新表的方法(更新、插入)  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何在Windows服务器上快速搭建网站?  如何有效防御Web建站篡改攻击?  如何在IIS中配置站点IP、端口及主机头?  制作电商网页,电商供应链怎么做?  常州自助建站费用包含哪些项目?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  广德云建站网站建设方案与建站流程优化指南  如何高效利用亚马逊云主机搭建企业网站?  孙琪峥织梦建站教程如何优化数据库安全?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  行程制作网站有哪些,第三方机票电子行程单怎么开?  深圳网站制作培训,深圳哪些招聘网站比较好?  做企业网站制作流程,企业网站制作基本流程有哪些?  定制建站流程解析:需求评估与SEO优化功能开发指南  建站之星导航如何优化提升用户体验?  建站主机选哪种环境更利于SEO优化?  如何通过智能用户系统一键生成高效建站方案?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  Android使用GridView实现日历的简单功能  如何打造高效商业网站?建站目的决定转化率  内网网站制作软件,内网的网站如何发布到外网?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  建站主机数据库如何配置才能提升网站性能?  网站制作员失业,怎样查看自己网站的注册者?  如何快速搭建高效WAP手机网站吸引移动用户?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  如何在云服务器上快速搭建个人网站?  制作农业网站的软件,比较好的农业网站推荐一下? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。