国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue-lazyload使用總結(推薦)

2019-11-19 12:35:54
字體:
來源:轉載
供稿:網(wǎng)友

當你用vue開發(fā)的時候,不可避免的就會遇到圖片懶加載的問題,之前jquery時代有jquery.lazyload.js,但是那個肯定不能用在vue的項目里。查閱資料后發(fā)現(xiàn)Vue-Lazyload這個插件用的頻率還是比較高,最近剛好也在研究vue的懶加載,順便也仔細研究了以下這個插件,這個插件確實能夠?qū)崿F(xiàn)懶加載,但是坑也有不少,今天就一起來看看Vue-Lazyload。 Vue-Lazyload的github地址

主要功能&實現(xiàn)思路

這篇文章不是去講解這個插件是如何配置的,這個在它的github上都有介紹,因此你要先大致了解它是如何配置的。這里主要從源碼角度去分析該如何正確使用這款插件。

v-lazy

這個是Vue-Lazyload最常用的一個東西,用法也非常的簡單:

<ul>   <li v-for="img in list">     <img v-lazy="img.src" >   </li></ul>

我們現(xiàn)在來看看它的內(nèi)部是如何實現(xiàn)的,首先我們進入它github上的源碼可以發(fā)現(xiàn)它的定義:

Vue.directive('lazy', {  bind: lazy.add.bind(lazy),  update: lazy.update.bind(lazy),  componentUpdated: lazy.lazyLoadHandler.bind(lazy),  unbind: lazy.remove.bind(lazy)})Vue.directive('lazy-container', {  bind: lazyContainer.bind.bind(lazyContainer),  update: lazyContainer.update.bind(lazyContainer),  unbind: lazyContainer.unbind.bind(lazyContainer)})

我們可以發(fā)現(xiàn)它是利用vue的自定義指令實現(xiàn)的,vue的自定義指令可以自定義v-***之類的指令,例如你定義了Vue.directive('demo',..)那么你就可以使用v-demo這樣的指令,當你使用了之后就會有對應事件供你回調(diào),例如bind,insert,unbind等,具體可以看看下面的demo:

=> vue自定義指令(二維碼)

進入demo后我們可以看到一進去就出發(fā)了bind和insert事件,然后你在輸入框輸入內(nèi)容就會觸發(fā)update和updateComponent事件,當你點擊隱藏就會觸發(fā)unbind事件,當你點擊顯示則又會觸發(fā)bind和insert事件。(具體含義可以去查閱官方文檔)

vue的自定義指令還可以帶參數(shù),例如vue-lazy:background-image.container='src'這樣的結構,我們可以通過事件里面的binding參數(shù)獲取到,例如上面的background-image可以通過binding.arg獲取,.container可以通過binding.modifiers獲取。

好了,講了這么多,v-lazy的實現(xiàn)思路應該比較清楚了,就是內(nèi)部實現(xiàn)了一個lazy的類,通過vue自定義指令將對象和參數(shù)傳進去,然后通過檢測事件(scroll等)檢測位置,如果一旦這個對象出現(xiàn)在屏幕里就加載圖片。下面看看已經(jīng)實現(xiàn)好的demo:(包含img的v-lazy和div的v-lazy:background-image兩種情況)

=> v-lazy demo(二維碼)

注意:這里的v-lazy='src'中的src一定要使用data里面的變量,不能寫真實的圖片路徑,這樣會報錯導致沒有效果,因為vue的自定義指令必須對應data中的變量或者是數(shù)字,你寫一個圖片路徑識別不了,我之前就是被坑了。(這里的圖片fadeIn效果是在load事件之后添加了一個fadeIn的class)。

v-lazy-container

這個總體上和v-lazy差不多,也是通過自定義指令去定義的,不過v-lazy-container掃描的是內(nèi)部的子元素,v-lazy-container一般使用如下:

<div v-lazy-container="{ selector: 'img' }">   <img data-src="http://domain.com/img1.jpg">  <img data-src="http://domain.com/img2.jpg">  <img data-src="http://domain.com/img3.jpg"></div>

v-lazy-container和v-lazy不同的是,v-lazy-container是通過設置指定的子元素的data-src,data-loading,data-error去設置圖片的路徑的,我們看內(nèi)部實現(xiàn)就可以看到:

const imgs = this.getImgs()imgs.forEach(el => {   this.lazy.add(el, assign({}, this.binding, {     value: {       src: 'dataset' in el ? el.dataset.src : el.getAttribute('data-src'),       error: 'dataset' in el ? el.dataset.error : el.getAttribute('data-error'),       loading: 'dataset' in el ? el.dataset.loading : el.getAttribute('data-loading')     }   }), this.vnode) })

下面是寫好的v-lazy-container demo:

=> v-lazy-container demo(二維碼)

注:v-lazy-container內(nèi)部指定元素設置的data-src是圖片的真實路徑,不能是data變量,這個和v-lazy完全相反。

lazy-component

這個和上面的不太一樣,這個嚴格來說不單單能夠做圖片懶加載,還可以做組件的懶加載,一般結構如下:

<lazy-component @show="handler">   <img class="mini-cover" :src="img.src" width="100%" height="400"></lazy-component>

實現(xiàn)方面,先用Vue.component('lazy-component',...)注冊了一個全局的組件,然后通過檢測位置,如果在視圖范圍之內(nèi)就吐出它內(nèi)部的內(nèi)容,這個設計還是比較巧妙:

render (h) {   if (this.show === false) {     return h(this.tag)   }   return h(this.tag, null, this.$slots.default) },

我們一般用component都是指定一個template,它這里是利用render來自己生成內(nèi)容,它這里通過一個變量show控制是否繪制內(nèi)部的內(nèi)容,開始的時候show為false,那么這里就繪制一個div(tag為div),等檢測(檢測div)出現(xiàn)屏幕了,show就為true,就會繪制它內(nèi)部的真實內(nèi)容了(this.$slots.default就是自定義控件下面的內(nèi)容)。

lazy-component作為一個組件,給外部提供了一個回調(diào)事件(show),表示已經(jīng)開始load了,所以我們可以在外層監(jiān)聽這個事件:

load () {   this.show = true   this.state.loaded = true   this.$emit('show', this) }

我們來看一個做好的demo,這個demo還是以實現(xiàn)圖片懶加載為主。

=> lazy-component demo(二維碼)

注:lazy-component本身不能實現(xiàn)圖片懶加載,它只是實現(xiàn)組件懶加載,上面demo真正實現(xiàn)懶加載是因為用了v-lazy。lazy-component有一個問題,就是它的上方必須要有東西,否則可能沒有效果,因為它在檢測的時候有一個判斷:bottom>0,所以如果你在第一個元素使用lazy-component可能沒有效果。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 额敏县| 酉阳| 调兵山市| 临汾市| 旬邑县| 苏州市| 鄯善县| 如东县| 滦平县| 罗定市| 舞阳县| 永济市| 丰原市| 福安市| 衡南县| 托克逊县| 松溪县| 商水县| 绿春县| 静海县| 湾仔区| 宿迁市| 鄂伦春自治旗| 通化县| 丰镇市| 万州区| 蓬莱市| 铁岭市| 库尔勒市| 万载县| 旬邑县| 安吉县| 石泉县| 吉林省| 长岛县| 治县。| 巩留县| 绥阳县| 榆中县| 定陶县| 黔江区|