日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

實現一個Vue自定義指令懶加載的方法示例

瀏覽:137日期:2023-01-16 09:43:42

在項目中如果有大量的圖片需要加載的時候,就可以考慮使用懶加載了,懶加載其實就是監聽瀏覽器的滾動,當滾動到一定的范圍的時候就將圖片的真實路徑賦給src,然后取消監聽。實現的方法也比較簡單,可以通過懶加載的插件實現,也可以手寫,手寫通過vue自定義指令來實現,一般情況自定義指令用的也不多,比較vue自帶的就夠用了,大型復雜的項目的可能用的多。

什么是圖片懶加載

當我們向下滾動的時候圖片資源才被請求到,這也就是我們本次要實現的效果,進入頁面的時候,只請求可視區域的圖片資源這也就是懶加載。

比如我們加載一個頁面,這個頁面很長很長,長到我們的瀏覽器可視區域裝不下,那么懶加載就是優先加載可視區域的內容,其他部分等進入了可視區域在加載。

這個功能非常常見,你打開淘寶的首頁,向下滾動,就會看到會有圖片不斷的加載;你在百度中搜索圖片,結果肯定成千上萬條,不可能所有的都一下子加載出來的,很重要的原因就是會有性能問題。你可以在Network中查看,在頁面滾動的時候,會看到圖片一張張加載出來。

實現一個Vue自定義指令懶加載的方法示例

為什么要做圖片懶加載

懶加載是一種網頁性能優化的方式,它能極大的提升用戶體驗。就比如說圖片,圖片一直是影響網頁性能的主要元兇,現在一張圖片超過幾兆已經是很經常的事了。如果每次進入頁面就請求所有的圖片資源,那么可能等圖片加載出來用戶也早就走了。所以,我們需要懶加載,進入頁面的時候,只請求可視區域的圖片資源。

總結出來就兩個點:

1.全部加載的話會影響用戶體驗

2.浪費用戶的流量,有些用戶并不像全部看完,全部加載會耗費大量流量。

懶加載原理

圖片的標簽是 img標簽,圖片的來源主要是 src屬性,瀏覽器是否發起加載圖片的請求是根據是否有src屬性決定的。

所以可以從 img標簽的 src屬性入手,在沒進到可視區域的時候,就先不給 img 標簽的 src屬性賦值。

懶加載實現

實現效果圖:

實現一個Vue自定義指令懶加載的方法示例

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title> <style> div { display: flex; flex-direction: column; } img { width: 100%; height: 300px; } </style></head><body> <div> <img data-src='https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657907683.jpeg'> <img data-src='https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657913523.jpeg'> <img data-src='https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657925550.jpeg'> <img data-src='https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657930289.jpeg'> <img data-src='https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657934750.jpeg'> <img data-src='https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657918315.jpeg'> </div></body></html>

監聽滾動根據offsetTop判斷

const imgs = [...document.getElementsByTagName(’img’)]; let n = 0; lazyload(); function throttle(fn, wait) { let timer = null; return function(...args) { if(!timer) { timer = setTimeout(() => { timer = null; fn.apply(this, args) }, wait) } } } window.addEventListener(’scroll’, throttle(lazyload, 200)); function lazyload() { var innerHeight = window.innerHeight; var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; for(let i = n; i < imgs.length; i++) { if(imgs[i].offsetTop < innerHeight + scrollTop) { imgs[i].src = imgs[i].getAttribute('data-src'); n = i + 1; } } }

可能會存在下面幾個問題:

每次滑動都要執行一次循環,如果有1000多個圖片,性能會很差 每次讀取 scrollTop 都會引起回流 scrollTop跟DOM的嵌套關系有關,應該根據getboundingclientrect獲取 滑到最后的時候刷新,會看到所有的圖片都加載了

IntersectionObserver

const imgs = [...document.getElementsByTagName(’img’)];// 當監聽的元素進入可視范圍內的會觸發回調 if(IntersectionObserver) { let lazyImageObserver = new IntersectionObserver((entries, observer) => { entries.forEach((entry, index) => { let lazyImage = entry.target; // 相交率,默認是相對于瀏覽器視窗 if(entry.intersectionRatio > 0) { lazyImage.src = lazyImage.getAttribute(’data-src’); // 當前圖片加載完之后需要去掉監聽 lazyImageObserver.unobserve(lazyImage); } }) }) for(let i = 0; i < imgs.length; i++) { lazyImageObserver.observe(imgs[i]); } }

codePen

vue自定義指令-懶加載

Vue自定義指令

下面的api來自官網自定義指令:

鉤子函數

bind: 只調用一次,指令第一次綁定到元素時調用。在這里可以進行一次性的初始化設置。 inserted: 被綁定元素插入父節點時調用 (僅保證父節點存在,但不一定已被插入文檔中)。 update: 所在組件的 VNode 更新時調用,但是可能發生在其子 VNode 更新之前。指令的值可能發生了改變,也可能沒有。但是你可以通過比較更新前后的值來忽略不必要的模板更新 componentUpdated: 指令所在組件的 VNode 及其子 VNode 全部更新后調用。 unbind: 只調用一次,指令與元素解綁時調用。

鉤子函數參數

指令鉤子函數會被傳入以下參數:

el:指令所綁定的元素,可以用來直接操作 DOM。 binding:一個對象,包含以下 property: name:指令名,不包括 v- 前綴。 value:指令的綁定值,例如:v-my-directive='1 + 1' 中,綁定值為 2。 oldValue:指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。 expression:字符串形式的指令表達式。例如 v-my-directive='1 + 1' 中,表達式為 '1 + 1'。 arg:傳給指令的參數,可選。例如 v-my-directive:foo 中,參數為 'foo'。 modifiers:一個包含修飾符的對象。例如:v-my-directive.foo.bar 中,修飾符對象為 { foo: true, bar: true }。 vnode:Vue 編譯生成的虛擬節點。 oldVnode:上一個虛擬節點,僅在 update 和 componentUpdated 鉤子中可用。

實現 v-lazyload 指令

<!DOCTYPE html><html lang='en'> <head> <meta charset='UTF-8' /> <meta name='viewport' content='width=device-width, initial-scale=1.0' /> <title>Document</title> <style> img { width: 100%; height: 300px; } </style> </head> <body> <div id='app'> <p v-for='item in imgs' :key='item'> <img v-lazyload='item'> </p> </div> </body> <script src='https://cdn.jsdelivr.net/npm/vue'></script> <script> Vue.directive('lazyload', { // 指令的定義 bind: function(el, binding) { let lazyImageObserver = new IntersectionObserver((entries, observer) => { entries.forEach((entry, index) => { let lazyImage = entry.target; // 相交率,默認是相對于瀏覽器視窗 if(entry.intersectionRatio > 0) { lazyImage.src = binding.value; // 當前圖片加載完之后需要去掉監聽 lazyImageObserver.unobserve(lazyImage); } }) }) lazyImageObserver.observe(el); }, }); var app = new Vue({ el: '#app', data: { imgs: [ ’https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657907683.jpeg’, ’https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657913523.jpeg’, ’https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657925550.jpeg’, ’https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657930289.jpeg’, ’https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657934750.jpeg’, ’https://cdn.suisuijiang.com/ImageMessage/5adad39555703565e79040fa_1590657918315.jpeg’, ] }, }); </script></html>

codePen

參考

延遲加載(Lazyload)三種實現方式

原生js實現圖片懶加載(lazyLoad)

到此這篇關于實現一個Vue自定義指令懶加載的方法示例的文章就介紹到這了,更多相關Vue自定義指令懶加載內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
你懂的国产精品| 久久伊人亚洲| 9久re热视频在线精品| 中文字幕亚洲在线观看| 国产日韩欧美中文在线| 日韩一区二区在线免费| 在线日韩成人| 性欧美videohd高精| 免费毛片在线不卡| 婷婷综合六月| 韩国女主播一区二区三区| 欧美专区18| 国产高清日韩| 日韩中文字幕av电影| 国产精品一区二区99| 极品裸体白嫩激情啪啪国产精品| 精品午夜视频| 亚洲无线观看| 国产精品极品在线观看| 91一区二区三区四区| 亚洲久久视频| 中文字幕亚洲精品乱码| 六月婷婷综合| 国产精品毛片aⅴ一区二区三区| 日韩在线播放一区二区| 国产麻豆一区二区三区精品视频| 在线精品亚洲| 99国产精品99久久久久久粉嫩| 日韩欧美二区| 激情五月色综合国产精品| 天堂√8在线中文| 国产精品成人3p一区二区三区| 欧美日韩一区二区三区不卡视频| 亚洲综合中文| 日韩精品一区第一页| 好吊视频一区二区三区四区| 精品一区二区三区亚洲| 精品一区二区三区免费看| 蜜桃视频在线观看一区二区| 亚洲精品成人| 一本色道精品久久一区二区三区| 99在线观看免费视频精品观看| 国产一区亚洲| 四虎成人av| 久久亚洲国产| 欧美午夜不卡| 香蕉久久99| 久久国产精品亚洲77777| 黄色av一区| 日韩av中文在线观看| 亚洲精品系列| 九九久久国产| 国产精品2023| 欧美韩一区二区| 国产真实久久| 日韩欧美精品一区二区综合视频| 国内精品美女在线观看| 久久超级碰碰| 亚洲视频国产| 日韩中文字幕亚洲一区二区va在线| 国产综合色区在线观看| 麻豆精品久久久| 国产精品久久久久久妇女| 在线免费观看亚洲| 天堂成人免费av电影一区| 色老板在线视频一区二区| 国产精品密蕾丝视频下载| 日韩激情av在线| 日韩av一区二区三区四区| 国产精品theporn| 免费视频久久| 首页国产精品| 麻豆精品在线观看| 成人在线超碰| 亚洲无线一线二线三线区别av| 欧美日韩1区| 亚洲欧美日韩在线观看a三区| 午夜精品影视国产一区在线麻豆| 92国产精品| 久久亚洲视频| 91麻豆精品| 国产色综合网| 亚洲精品在线影院| 青青草91视频| 亚洲理论在线| 亚洲免费婷婷| 在线观看一区| 欧美偷窥清纯综合图区| 欧美精品高清| 麻豆精品av| 日韩国产精品久久久久久亚洲| 日韩高清中文字幕一区二区| 欧美日韩一区二区三区四区在线观看 | 久久国产精品色av免费看| 国产精品免费大片| 麻豆久久久久久| 国产一区二区三区自拍| 久久视频精品| 欧美午夜精彩| 黄色在线网站噜噜噜| 精品一区二区三区的国产在线观看| 91大神在线观看线路一区| 久久尤物视频| 婷婷激情一区| 中文字幕av一区二区三区人| 亚洲调教视频在线观看| 伊人久久大香线蕉av超碰演员| 天堂√中文最新版在线| 精品成人18| 久久亚洲成人| 国产欧美二区| 欧美日韩第一| 欧美日韩1区| 日韩不卡免费高清视频| 亚洲性视频h| 老牛影视一区二区三区| 青青国产91久久久久久| 伊人久久高清| 日本在线啊啊| 日本欧美韩国一区三区| 亚洲天堂成人| 日韩激情网站| 免费亚洲婷婷| 精品中文字幕一区二区三区四区| 日韩欧美一区免费| 国产日韩三级| 日韩中文字幕区一区有砖一区| 国产精品极品在线观看| 黑丝一区二区| 亚洲色图网站| 97人人精品| 快she精品国产999| 欧洲av不卡| 国产欧美一区二区三区米奇| 国内精品99| 久久精品电影| 蜜桃久久久久久久| 国产成人精品一区二区免费看京 | 久久精品电影| 综合亚洲色图| 水蜜桃精品av一区二区| 欧美亚洲综合视频| 国产日韩专区| 久久不射中文字幕| 精品视频在线观看网站| 亚洲人www| 久久裸体视频| 日韩欧美精品综合| 成人影视亚洲图片在线| 狠狠躁少妇一区二区三区| 国产精品一区二区三区www| 午夜一区在线| 精品成人免费一区二区在线播放| 国产精品流白浆在线观看| 日韩高清一区在线| 亚洲欧美日本国产| 三级久久三级久久久| 亚洲电影在线一区二区三区| 视频一区视频二区在线观看| 亚洲综合精品四区| 亚洲自拍另类| 欧美日韩激情在线一区二区三区| 久久久久久免费视频| 亚洲成人日韩| 老司机精品久久| 国产精品自在| 成人看片网站| 欧美偷窥清纯综合图区| 亚洲乱码视频| 亚洲精品观看| 国产精品chinese| www.51av欧美视频| 久久在线电影| 国产欧美大片| 久久伊人亚洲| 国产精选在线| 91精品韩国| 国产亚洲毛片在线| 麻豆一区二区三| 免费黄网站欧美| 久久久久欧美精品| 日韩一区欧美| 国产第一亚洲| 少妇久久久久| 亚洲一区日本| 精品日韩一区| 亚洲在线电影| 久久久久久久欧美精品| 婷婷精品久久久久久久久久不卡| 久久久久久久久丰满| 国产精品一国产精品| 日韩综合一区| 亚洲在线一区| 黄色在线网站噜噜噜| 日本精品久久| 中文在线不卡| 久久久国产亚洲精品| 日韩激情一二三区| 欧美精品资源| 国产精品一卡|