Vue 圖片懶加載 之 Vue-Lazyload

什么叫懶加載

通俗講 : 懶加載就是延時加載,即當需要用到的時候再去加載。

那什么叫做需要用到的時候?

比如一個圖片在沒有出現(xiàn)在可視區(qū)域內,就已經加載當頁面里了, 但只有滾動頁面下方式才能看見, 則可以認為這個圖片加載的"過早"了。

懶加載的優(yōu)點

  1. 可以減少首頁首次加載的數(shù)量,減少服務器的壓力
  2. 當網絡請求比較慢的時候, 提前給這張圖片添加一個像素比較低的占位圖片,不至于堆疊在一塊,或顯示大片空白,讓用戶體驗更好一點。

為什么使用懶加載

可以想象一個網頁打開有成百上千的圖片需要加載,頁面會變得非常的卡頓,此時如果只是可視區(qū)域的圖片加載,其他的圖片可以暫時有一個占位 loading 圖,等滾動它們到可視區(qū)域時再去請求真實圖片并且替換就好了。vue-lazyload 插件就是解決此類問題的,對vue插件的寫法不熟悉的可以先看一下vue插件

懶加載原理是什么

先將 img 標簽中的src鏈接設為同一張圖片(空白圖片),將其真正的圖片地址存儲再 img 標簽的自定義屬性中(比如data-src)。當js監(jiān)聽到該圖片元素進入可視窗口時,即將自定義屬性中的地址存儲到src屬性中,達到懶加載的效果。

如何實現(xiàn)懶加載

第一步: 安裝

npm install vue-lazyload --save

第二步: 全局注冊

main.js 文件
import VueLazyload from 'vue-lazyload'
Vue.use(VueLazyload)
// 配置項
Vue.use(VueLazyload, {
  preLoad: 1.3,
  error: 'dist/error.png',
  loading: 'dist/loading.gif',
  attempt: 1
})
描述 默認 選項
preLoad 表示lazyload的元素,距離頁面底部距離的百分比.計算值為(preload - 1) 1.3 Number
error 加載失敗后圖片地址 'data-src' String
loading 加載時圖片地址 'data-src' String
attempt 圖片加載失敗后的重試次數(shù) 3 Number
listenEvents 觸發(fā)懶加載的事件 ['scroll','wheel','mousewheel','resize','animationend','transitionend','touchmove']
adapter 注冊img 的loading,loaded,error三個狀態(tài)的回調函數(shù),參數(shù)會暴露懶加載的img元素,可以對其進行作. { }
filter img未加載之前,解析到src 的時候注冊的回調函數(shù).可以在加載圖片之前,對src進行修改.注冊在filter下的所有的函數(shù)都會執(zhí)行 {}
lazyComponent 是否啟用懶加載組件.<lazy-component>組件中的內容只有在出現(xiàn)在preload的位置中才會加載組件.這個lazyloadComponent組件有個缺點就是,組件在加載前是什么都不渲染的,這樣子的話,有可能會影響布局,以及加載前到加載后的切換不好,有點突兀和生硬. false Boolean
dispatchEvent 觸發(fā)dom事件 false Number
throttleWait 等待時長 200 Number
observer 等待時長 是否啟用IntersectionObserver,這個api有兼容問題 Number
observerOptions IntersectionObserver選項 { rootMargin: '0px',threshold: 0.1 }
silent 不打印調試信息 true Boolean

因為src中的文件會被webpack編譯,assets文件夾中的圖片地址,會在編譯過程中重命名。vue-lazyload是在main.js文件中引入,不會被webpack進行編譯,因此vue-lazyload無法獲得正確的圖片地址,所以直接寫相對地址就無法獲取到圖片正確地址

第三步: 寫loading圖片的樣式(不是必須, 視情況而定)

img[lazy="loading"]{
  display:block;
  width:50px !important;
  height:50px !important;
  margin:0 auto;
  }

第四步: 使用 ( :src--->v-lazy )

  <div class="lazyLoad">
    <ul id="container">
      <li v-for="img in arr">
        <img v-lazy="img.thumbnail_pic_s">
      </li>
    </ul>
  </div>

這里有個坑需要注意
如設置了翻頁功能,且每一頁都是請求的數(shù)據(jù)進行渲染。
會發(fā)現(xiàn)其他的數(shù)據(jù)都變了,唯獨圖片還是原來的圖片。
由于使用的數(shù)據(jù)是父組件傳過來的,第一個想到父組件axios異步請求的數(shù)據(jù)導致子組件可能數(shù)據(jù)沒有動態(tài)更新。但監(jiān)聽了下數(shù)據(jù),發(fā)現(xiàn)確實是改變了 .
解決辦法只要加個key就行, 如下代碼

<ul>  
    <li v-for="img in list">
        <img v-lazy="img.src" :key="img.src" >
    </li>
</ul>
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容