本篇文章為大家展示了Vue中自定義圖片懶加載指令,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
目前創(chuàng)新互聯(lián)公司已為上千余家的企業(yè)提供了網(wǎng)站建設、域名、雅安服務器托管、網(wǎng)站托管、服務器托管、企業(yè)網(wǎng)站設計、嘉黎網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。先看如何使用這個指令:
imageSrc是要加載的圖片的實際路徑。
為了實現(xiàn)這個指令,我們首先單獨建立一個文件,名字為lazyload.js.并填寫基本的代碼,如下:
//Vue 圖片懶加載,導出模塊 export default (Vue , options = {})=>{ //初始化的選項,default是未加載圖片時顯示的默認圖片 var init = { default: 'https://cache.yisu.com/upload/information/20200622/114/74726.png' } //addListener為Vue指令的具體實現(xiàn)功能函數(shù),我們這里為所有使用v-lazyload的指令的元素添加監(jiān)聽 //ele 是dom元素,binding是綁定的具體值, //例如: 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://cache.yisu.com/upload/information/20200622/114/74726.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最終我們的代碼如下:
//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://cache.yisu.com/upload/information/20200622/114/74726.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{ //綁定的圖片地址 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指令即可
上述內(nèi)容就是Vue中自定義圖片懶加載指令,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設公司行業(yè)資訊頻道。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前標題:Vue中自定義圖片懶加載指令-創(chuàng)新互聯(lián)
分享鏈接:http://weahome.cn/article/ddoiss.html