vue3使用自定義指令和VueUse實(shí)現(xiàn)圖片懶加載


前情提要:當(dāng)頁面有很多圖片要展示的時(shí)候崖咨,為了不造成資源浪費(fèi),暫未在窗口可視區(qū)域的圖片著洼,可以采用圖片懶加載的功能易茬。

1. 安裝VueUse npm i @vueuse/core

VueUse 是一個(gè)基于 Composition API 的實(shí)用程序函數(shù)集合。

VueUse 官網(wǎng)地址:https://vueuse.org

useIntersectionObserver函數(shù) 如下圖介紹

屏幕截圖 2023-09-25 194359.png

2. 在main.js中全局注冊該自定義指令

import { useIntersectionObserver } from '@vueuse/core'

// 定義全局命令
app.directive('img-lazy', {
    mounted(el, binding) {
        // el:指定綁定的那個(gè)元素   img
        // binding: binding.value 指令等于后面綁定的表達(dá)式的值 圖片的地址
        console.log(el, binding)
        useIntersectionObserver(
            el,
            ([{ isIntersecting }]) => {
                if (isIntersecting) {
                    el.src = binding.value
                }
            },
        )
    }
})

3. 在頁面使用該指令

<img v-img-lazy="item.picture" alt="">

刷新頁面萧吠,發(fā)現(xiàn)圖片懶加載功能已經(jīng)實(shí)現(xiàn)左冬。

代碼優(yōu)化

思考:懶加載指令放在main.js入口文件里面合理嗎?
答:不合理纸型,入口文件通常只做一些初始化的事情拇砰,不應(yīng)該包含太多的邏輯的代碼,可以通過插件的方法狰腌,把懶加載指令封裝為插件除破。

  • src下面新建directives/index.js 文件
import { useIntersectionObserver } from '@vueuse/core'

export const lazyPlugin = {
    install(app) {
        // 定義懶加載指令
        app.directive('img-lazy', {
            mounted(el, binding) {
                console.log(el, binding)
                useIntersectionObserver(
                    el,
                    ([{ isIntersecting }]) => {
                        if (isIntersecting) {
                            el.src = binding.value
                        }
                    },
                )

            }
        })
    }
}
  • 在main.js入口文件中注冊該組件
import { lazyPlugin } from '@/directives'
app.use(lazyPlugin)

問題:useIntersectionObserver 對于函數(shù)的監(jiān)聽是一直都存在的,除非手動停止監(jiān)聽琼腔,否則會造成資源浪費(fèi)問題瑰枫。

解決思路:在圖片的第一次加載完成之后就停止監(jiān)聽

const { stop } = useIntersectionObserver(
      el,
      ([{ isIntersecting }]) => {
           if (isIntersecting) {
               el.src = binding.value
                stop()
            }
       },
)

以上就是今天寫的內(nèi)容啦,希望和大家一起共同學(xué)習(xí)丹莲,如果有錯(cuò)誤希望給我回復(fù)喔O(∩_∩)O~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末光坝,一起剝皮案震驚了整個(gè)濱河市尸诽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盯另,老刑警劉巖性含,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異土铺,居然都是意外死亡胶滋,警方通過查閱死者的電腦和手機(jī)板鬓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門悲敷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俭令,你說我怎么就攤上這事后德。” “怎么了抄腔?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵瓢湃,是天一觀的道長。 經(jīng)常有香客問我赫蛇,道長绵患,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任悟耘,我火速辦了婚禮落蝙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暂幼。我一直安慰自己筏勒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布旺嬉。 她就那樣靜靜地躺著管行,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邪媳。 梳的紋絲不亂的頭發(fā)上捐顷,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音雨效,去河邊找鬼套菜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛设易,可吹牛的內(nèi)容都是我干的逗柴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼顿肺,長吁一口氣:“原來是場噩夢啊……” “哼戏溺!你這毒婦竟也來了渣蜗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旷祸,失蹤者是張志新(化名)和其女友劉穎耕拷,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體托享,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骚烧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闰围。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赃绊。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖羡榴,靈堂內(nèi)的尸體忽然破棺而出碧查,到底是詐尸還是另有隱情,我是刑警寧澤校仑,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布忠售,位于F島的核電站,受9級特大地震影響迄沫,放射性物質(zhì)發(fā)生泄漏稻扬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一羊瘩、第九天 我趴在偏房一處隱蔽的房頂上張望泰佳。 院中可真熱鬧,春花似錦困后、人聲如沸乐纸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汽绢。三九已至,卻和暖如春侧戴,著一層夾襖步出監(jiān)牢的瞬間宁昭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工酗宋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留积仗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓蜕猫,卻偏偏與公主長得像寂曹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容