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

您的位置:首頁技術(shù)文章
文章詳情頁

實(shí)現(xiàn)一個(gè)Vue自定義指令懶加載的方法示例

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

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

什么是圖片懶加載

當(dāng)我們向下滾動(dòng)的時(shí)候圖片資源才被請(qǐng)求到,這也就是我們本次要實(shí)現(xiàn)的效果,進(jìn)入頁面的時(shí)候,只請(qǐng)求可視區(qū)域的圖片資源這也就是懶加載。

比如我們加載一個(gè)頁面,這個(gè)頁面很長很長,長到我們的瀏覽器可視區(qū)域裝不下,那么懶加載就是優(yōu)先加載可視區(qū)域的內(nèi)容,其他部分等進(jìn)入了可視區(qū)域在加載。

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

實(shí)現(xiàn)一個(gè)Vue自定義指令懶加載的方法示例

為什么要做圖片懶加載

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

總結(jié)出來就兩個(gè)點(diǎn):

1.全部加載的話會(huì)影響用戶體驗(yàn)

2.浪費(fèi)用戶的流量,有些用戶并不像全部看完,全部加載會(huì)耗費(fèi)大量流量。

懶加載原理

圖片的標(biāo)簽是 img標(biāo)簽,圖片的來源主要是 src屬性,瀏覽器是否發(fā)起加載圖片的請(qǐng)求是根據(jù)是否有src屬性決定的。

所以可以從 img標(biāo)簽的 src屬性入手,在沒進(jìn)到可視區(qū)域的時(shí)候,就先不給 img 標(biāo)簽的 src屬性賦值。

懶加載實(shí)現(xiàn)

實(shí)現(xiàn)效果圖:

實(shí)現(xiàn)一個(gè)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>

監(jiān)聽滾動(dòng)根據(jù)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; } } }

可能會(huì)存在下面幾個(gè)問題:

每次滑動(dòng)都要執(zhí)行一次循環(huán),如果有1000多個(gè)圖片,性能會(huì)很差 每次讀取 scrollTop 都會(huì)引起回流 scrollTop跟DOM的嵌套關(guān)系有關(guān),應(yīng)該根據(jù)getboundingclientrect獲取 滑到最后的時(shí)候刷新,會(huì)看到所有的圖片都加載了

IntersectionObserver

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

codePen

vue自定義指令-懶加載

Vue自定義指令

下面的api來自官網(wǎng)自定義指令:

鉤子函數(shù)

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

鉤子函數(shù)參數(shù)

指令鉤子函數(shù)會(huì)被傳入以下參數(shù):

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

實(shí)現(xiàn) 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; // 相交率,默認(rèn)是相對(duì)于瀏覽器視窗 if(entry.intersectionRatio > 0) { lazyImage.src = binding.value; // 當(dāng)前圖片加載完之后需要去掉監(jiān)聽 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)三種實(shí)現(xiàn)方式

原生js實(shí)現(xiàn)圖片懶加載(lazyLoad)

到此這篇關(guān)于實(shí)現(xiàn)一個(gè)Vue自定義指令懶加載的方法示例的文章就介紹到這了,更多相關(guān)Vue自定義指令懶加載內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品视频一区二区三区四蜜臂 | 国产欧美高清视频在线| 99久久精品网站| 久久久久亚洲精品中文字幕| 亚洲午夜视频| 欧美国产美女| 精品国产亚洲一区二区三区大结局 | 欧美丰满日韩| 欧美国产免费| 91成人在线网站| 黄页网站一区| 亚洲大片在线| 久久美女精品| 欧美午夜精品一区二区三区电影| av免费不卡国产观看| 久久国产福利| 好吊视频一区二区三区四区| 日韩免费视频| 丝袜诱惑一区二区| 国产一区二区三区久久| 欧美国产中文高清| 国产精品日韩欧美一区| 精品在线播放| 黄色成人91| 亚洲一区二区成人| 欧美日韩日本国产亚洲在线 | 日韩va亚洲va欧美va久久| 影音先锋久久精品| 亚洲人亚洲人色久| 久久影视一区| 亚洲伦乱视频| 亲子伦视频一区二区三区| 成人亚洲欧美| 91精品综合| 精品在线99| 国内亚洲精品| 日韩视频免费| 日韩精品一卡二卡三卡四卡无卡| 久久亚洲欧美| 日本不卡视频一二三区| 国产美女亚洲精品7777| 久久国产三级| 免费一区二区三区在线视频| 精品中文字幕一区二区三区四区| 丁香婷婷久久| 久久蜜桃资源一区二区老牛| 成人久久一区| 亚洲欧美日韩在线观看a三区| 日韩和的一区二在线| 久久国产中文字幕| 久久国产精品99国产| 欧美亚洲一区二区三区| 欧美韩日一区| 国产毛片久久| 国产欧美一区二区精品久久久 | 蜜桃av在线播放| 视频二区不卡| 国产色综合网| 亚洲区第一页| 国语精品一区| 好看的av在线不卡观看| 蜜臀91精品一区二区三区| 日本a级不卡| 欧美激情另类| 香蕉久久国产| 欧美国产另类| 欧美日韩在线播放视频| 美女网站一区| 日本不卡的三区四区五区| 美女高潮久久久| 日本美女一区| 日韩 欧美一区二区三区| 精品中国亚洲| 亚洲女人av| 久久一区亚洲| 国产精品美女久久久浪潮软件| 欧美日韩伊人| 亚洲播播91| 亚洲激情二区| 国产激情欧美| 亚洲国产专区校园欧美| 日韩精品亚洲aⅴ在线影院| 日韩av在线播放网址| 99亚洲视频| 精品久久中文| 日韩三级精品| 亚洲欧美日韩在线观看a三区 | 亚洲精品成人图区| 欧美日本久久| 只有精品亚洲| 黄色亚洲大片免费在线观看| 成人午夜网址| 久久成人福利| 国产欧美大片| 奇米狠狠一区二区三区| 免费看欧美美女黄的网站| 久久久久久久久丰满| 精品中文在线| 国产欧美日韩一级| 亚洲免费专区| 最新国产拍偷乱拍精品| 日韩精品免费一区二区三区| 久久精品人人| 国产精品毛片久久久| 日韩三区四区| 亚洲精品一二三**| 巨乳诱惑日韩免费av| 91久久黄色| 99香蕉国产精品偷在线观看 | 丁香婷婷久久| 国产精品麻豆成人av电影艾秋| 综合在线一区| 免费欧美在线视频| 一本一本久久| 好吊视频一区二区三区四区| 久久一区二区三区喷水| 久久国产日韩| japanese国产精品| 亚洲精品电影| 欧美日韩国产亚洲一区| 99成人在线| 午夜一区在线| 深夜福利亚洲| 日韩不卡免费视频| 国产欧美久久一区二区三区| 日韩精品国产精品| 国产美女久久| 精品一区二区三区亚洲| 四季av一区二区凹凸精品| 国产网站在线| 欧美日韩精品免费观看视完整| 日本不良网站在线观看| 色天使综合视频| 欧美丝袜一区| 亚洲欧美视频| 日韩精品高清不卡| 国产精品chinese| 国模大尺度视频一区二区| 国产一区二区三区黄网站| 手机在线电影一区| 不卡福利视频| 午夜精品亚洲| 日本亚洲不卡| 精品视频97| 999精品在线| 美女日韩在线中文字幕| 日精品一区二区三区| 国产亚洲一区二区三区啪| 国产精品久久久久av蜜臀 | 欧美在线不卡| 久久精品亚洲一区二区| 91精品韩国| 国产精品毛片| 日本少妇精品亚洲第一区| 国产亚洲字幕| 日韩精品专区| 久久亚洲风情| 久久国产人妖系列| 美女av在线免费看| 亚洲一区二区三区高清| 欧美日韩一区自拍| 日韩欧美三级| 亚洲欧美一级| 精品免费av| 99视频+国产日韩欧美| 欧美一级一区| 日韩精品欧美| 日本a级不卡| 日韩精品不卡一区二区| 99热精品在线观看| 国产福利一区二区三区在线播放| www成人在线视频| 中文字幕亚洲在线观看| 国内揄拍国内精品久久| 一区二区亚洲精品| 国产激情欧美| 99成人在线| 国产精品视频一区二区三区| 久久精选视频| 亚洲69av| 神马久久午夜| 亚洲69av| 欧产日产国产精品视频| 亚欧洲精品视频在线观看| 国产精品久久久久久模特| 国产字幕视频一区二区| 91精品福利观看| 亚洲先锋成人| 国产精品nxnn| 一区二区三区午夜视频| 国产99在线| 日韩va亚洲va欧美va久久| 91精品国产调教在线观看| 91精品啪在线观看国产爱臀| 欧美成人基地 | 亚洲欧洲日本mm| 国产精品三级| 亚洲一区欧美激情| 高潮久久久久久久久久久久久久| 国产视频一区免费看|