最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue自定義圖片懶加載指令v-lazyload詳解

 更新時間:2020年12月31日 11:59:34   作者:斷劫斷念  
這篇文章主要為大家詳細介紹了Vue自定義圖片懶加載指令v-lazyload,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Vue是可以自定義指令的,最近學(xué)習(xí)過程中遇見了一個需要圖片懶加載的功能,最后參考了別人的代碼和思路自己重新寫了一遍。以下將詳細介紹如何實現(xiàn)自定義指令v-lazyload。

先看如何使用這個指令:  

<img v-lazyload="imageSrc" >

imageSrc是要加載的圖片的實際路徑。

為了實現(xiàn)這個指令,我們首先單獨建立一個文件,名字為lazyload.js.并填寫基本的代碼,如下:  

//Vue 圖片懶加載,導(dǎo)出模塊
export default (Vue , options = {})=>{
  //初始化的選項,default是未加載圖片時顯示的默認圖片
 var init = {
    default: 'https://gw.alicdn.com/tps/i1/TB147JCLFXXXXc1XVXXxGsw1VXX-112-168.png'
 }
  //addListener為Vue指令的具體實現(xiàn)功能函數(shù),我們這里為所有使用v-lazyload的指令的元素添加監(jiān)聽
  //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指令的執(zhí)行不同階段提供的鉤子函數(shù),查看Vue的官網(wǎng)可以看到一共有5個階段, 

指令定義函數(shù)提供了幾個鉤子函數(shù)(可選):

bind: 只調(diào)用一次,指令第一次綁定到元素時調(diào)用,用這個鉤子函數(shù)可以定義一個在綁定時執(zhí)行一次的初始化動作。

inserted: 被綁定元素插入父節(jié)點時調(diào)用(父節(jié)點存在即可調(diào)用,不必存在于 document 中)。

update: 被綁定元素所在的模板更新時調(diào)用,而不論綁定值是否變化。通過比較更新前后的綁定值,可以忽略不必要的模板更新(詳細的鉤子函數(shù)參數(shù)見下)。

componentUpdated: 被綁定元素所在模板完成一次更新周期時調(diào)用。

unbind: 只調(diào)用一次, 指令與元素解綁時調(diào)用。

這里我們只用inserted和updated就夠了。

  接下來我們具體實現(xiàn)addListener的實現(xiàn)。我們的具體思路如下:

  1、先看看這個圖片是否需要懶加載。有兩種情況,一是圖片還沒到達可視區(qū)域,二是圖片已經(jīng)加載過了。

  2、然后監(jiān)聽窗口的scroll事件,判斷哪些圖片可以進行懶加載了。

  這里我們需要一個需要進行監(jiān)聽需要懶加載的圖片列表和一個需要記錄已經(jīng)加載過得圖片列表。另外為了方便數(shù)組的操作,我們加一個數(shù)組的remove方法。

繼續(xù)我們的代碼。

//Vue 圖片懶加載
export default (Vue , options = {})=>{
  
  //數(shù)組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' 
  }  
  //需要進行監(jiān)聽的圖片列表,還沒有加載過得 
  var listenList = [];
  //已經(jīng)加載過得圖片緩存列表
 var imageCatcheList = [];
  //是否已經(jīng)加載過了
 const isAlredyLoad = (imageSrc) => {
  
 }
 //檢測圖片是否可以加載,如果可以則進行加載
 const isCanShow = (item) =>{
  
 };
  //添加監(jiān)聽事件scroll
 const onListenScroll = () =>{
  
 }
 //Vue 指令最終的方法
 const addListener = (ele,binding) =>{
  //綁定的圖片地址
  var imageSrc = binding.value;
  //如果已經(jīng)加載過,則無需重新加載,直接將src賦值
  if(isAlredyLoad(imageSrc)){
   ele.src = imageSrc;
   return false;
  }
  var item = {
   ele:ele,
   src:imageSrc
  }
  //圖片顯示默認的圖片
  ele.src = init.default;
  //再看看是否可以顯示此圖片
  if(isCanShow(item)){
   return
  }
  //否則將圖片地址和元素均放入監(jiān)聽的lisenList里
  listenList.push(item);
  
  //然后開始監(jiān)聽頁面scroll事件
  onListenScroll();
 }

 Vue.directive('lazyload',{
  inserted:addListener,
  updated:addListener
 })
}

接下來就幾個空方法的實現(xiàn)了。

isAlredyLoad ,判斷是否已經(jīng)加載過了這個圖片

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

isCanShow 圖片是否進入可視區(qū)域,如果已經(jīng)進入則進行加載

//檢測圖片是否可以加載,如果可以則進行加載
 const isCanShow = (item) =>{
  var ele = item.ele;
  var src = item.src;
  //圖片距離頁面頂部的距離
  var top = ele.getBoundingClientRect().top;
  //頁面可視區(qū)域的高度
  var windowHeight = window.innerHight;
  //top + 10 已經(jīng)進入了可視區(qū)域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監(jiān)聽滾動事件,并且檢測是否進入可視區(qū)域。

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;
  //頁面可視區(qū)域的高度
  var windowHeight = window.innerHight;
  //top + 10 已經(jīng)進入了可視區(qū)域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;
  //如果已經(jīng)加載過,則無需重新加載,直接將src賦值
  if(isAlredyLoad(imageSrc)){
   ele.src = imageSrc;
   return false;
  }
  var item = {
   ele:ele,
   src:imageSrc
  }
  //圖片顯示默認的圖片
  ele.src = init.default;
  //再看看是否可以顯示此圖片
  if(isCanShow(item)){
   return
  }
  //否則將圖片地址和元素均放入監(jiān)聽的lisenList里
  listenList.push(item);
  
  //然后開始監(jiān)聽頁面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" >

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談vue實現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty

    淺談vue實現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty

    本篇文章主要介紹了淺談vue實現(xiàn)數(shù)據(jù)監(jiān)聽的函數(shù) Object.defineProperty,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Vue綁定class和綁定內(nèi)聯(lián)樣式的實現(xiàn)方法

    Vue綁定class和綁定內(nèi)聯(lián)樣式的實現(xiàn)方法

    本文主要介紹了Vue綁定class和綁定內(nèi)聯(lián)樣式的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • vue.js內(nèi)置組件之keep-alive組件使用

    vue.js內(nèi)置組件之keep-alive組件使用

    keep-alive是Vue.js的一個內(nèi)置組件。這篇文章主要介紹了vue.js內(nèi)置組件之keep-alive組件使用,需要的朋友可以參考下
    2018-07-07
  • 基于vue2.0實現(xiàn)的級聯(lián)選擇器

    基于vue2.0實現(xiàn)的級聯(lián)選擇器

    這篇文章主要介紹了基于vue2.0實現(xiàn)的級聯(lián)選擇器,基于Vue的級聯(lián)選擇器,可以單項,二級, 三級級聯(lián),多級級聯(lián),有興趣可以了解一下
    2017-06-06
  • 基于Vue 實現(xiàn)一個中規(guī)中矩loading組件

    基于Vue 實現(xiàn)一個中規(guī)中矩loading組件

    這篇文章主要介紹了基于Vue 實現(xiàn)一個中規(guī)中矩loading組件,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • 使用Vue3實現(xiàn)倒計時器及倒計時任務(wù)的完整代碼

    使用Vue3實現(xiàn)倒計時器及倒計時任務(wù)的完整代碼

    文章介紹了如何使用Vue3和Element-plus開發(fā)一個倒計時器和倒計時任務(wù)管理界面,倒計時器具備手動設(shè)置、開始、暫停和重啟功能,文章還提供了倒計時器的完整代碼,包括HTML、JavaScript和CSS部分,感興趣的朋友一起看看吧
    2024-11-11
  • vue實現(xiàn)點擊圖片放大效果

    vue實現(xiàn)點擊圖片放大效果

    這篇文章主要為大家詳細介紹了vue實現(xiàn)點擊圖片放大效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 解決Vue開發(fā)中對話框被遮罩層擋住的問題

    解決Vue開發(fā)中對話框被遮罩層擋住的問題

    在Vue的開發(fā)中,一旦我們用到對話框,經(jīng)常出現(xiàn)的問題是對話框被遮罩層擋住,怎么來解決這個問題呢?下面小編給大家?guī)砹薞ue開發(fā)中對話框被遮罩層擋住的問題及解決方法,一起看看吧
    2018-11-11
  • 解決vue組件中click事件失效的問題

    解決vue組件中click事件失效的問題

    今天小編就為大家分享一篇解決vue組件中click事件失效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 使用vue指令實現(xiàn)吸頂效果

    使用vue指令實現(xiàn)吸頂效果

    要想實現(xiàn)一個吸頂效果不是很難,網(wǎng)絡(luò)上有很多教程,其中有一種就是通過fiexd加top來實現(xiàn),今天突然就想做一個吸頂效果,因為最近都在用vue,所以想用vue來做一個吸頂效果的案例,感興趣的朋友可以參考下
    2023-11-11

最新評論

开封县| 大方县| 新民市| 揭阳市| 衡南县| 宁海县| 博罗县| 敦化市| 福贡县| 满洲里市| 武功县| 双鸭山市| 仁寿县| 牟定县| 集安市| 大姚县| 株洲县| 洛宁县| 东港市| 正镶白旗| 吉木萨尔县| 三河市| 沙雅县| 托克逊县| 昌宁县| 龙山县| 洛宁县| 镇雄县| 平山县| 萨嘎县| 伊川县| 都江堰市| 宿迁市| 多伦县| 北碚区| 青浦区| 吐鲁番市| 永吉县| 青浦区| 尼玛县| 含山县|