91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue-lazyload如何用

發布時間:2022-05-05 16:42:23 來源:億速云 閱讀:217 作者:iii 欄目:大數據

這篇文章主要介紹了vue-lazyload如何用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇vue-lazyload如何用文章都會有所收獲,下面我們一起來看看吧。

v-lazy

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

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

我們現在來看看它的內部是如何實現的,首先我們進入它github上的源碼可以發現它的定義:

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)
})

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

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

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

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

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

=> v-lazy demo(二維碼)

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

v-lazy-container

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

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

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

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內部指定元素設置的data-src是圖片的真實路徑,不能是data變量,這個和v-lazy完全相反。

lazy-component

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

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

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

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

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

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

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

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

=> lazy-component demo(二維碼)

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

關于“vue-lazyload如何用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“vue-lazyload如何用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙河市| 安西县| 阜康市| 昌宁县| 高台县| 襄垣县| 铁力市| 通州市| 南汇区| 西华县| 通江县| 大悟县| 桐柏县| 石家庄市| 尼勒克县| 青川县| 永济市| 宁明县| 延庆县| 遂平县| 秦安县| 荆门市| 石楼县| 兴义市| 屯留县| 抚顺市| 应城市| 荔波县| 称多县| 兴城市| 兴山县| 阳西县| 东安县| 蒙城县| 龙泉市| 福清市| 洪泽县| 泰州市| 鄂伦春自治旗| 保亭| 巧家县|