最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue-lazyload使用總結(jié)(推薦)

 更新時(shí)間:2018年11月01日 14:10:04   作者:秋天愛(ài)美麗  
vue項(xiàng)目用到vue-lazyload做圖片懶加載,這篇文章主要介紹了vue-lazyload使用總結(jié),解決這個(gè)插件的坑,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

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

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

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

v-lazy

這個(gè)是Vue-Lazyload最常用的一個(gè)東西,用法也非常的簡(jiǎn)單:

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

我們現(xiàn)在來(lái)看看它的內(nèi)部是如何實(shí)現(xiàn)的,首先我們進(jì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的自定義指令實(shí)現(xiàn)的,vue的自定義指令可以自定義v-***之類的指令,例如你定義了Vue.directive('demo',..)那么你就可以使用v-demo這樣的指令,當(dāng)你使用了之后就會(huì)有對(duì)應(yīng)事件供你回調(diào),例如bind,insert,unbind等,具體可以看看下面的demo:

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

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

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

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

=> v-lazy demo(二維碼)

注意:這里的v-lazy='src'中的src一定要使用data里面的變量,不能寫(xiě)真實(shí)的圖片路徑,這樣會(huì)報(bào)錯(cuò)導(dǎo)致沒(méi)有效果,因?yàn)関ue的自定義指令必須對(duì)應(yīng)data中的變量或者是數(shù)字,你寫(xiě)一個(gè)圖片路徑識(shí)別不了,我之前就是被坑了。(這里的圖片fadeIn效果是在load事件之后添加了一個(gè)fadeIn的class)。

v-lazy-container

這個(gè)總體上和v-lazy差不多,也是通過(guò)自定義指令去定義的,不過(guò)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是通過(guò)設(shè)置指定的子元素的data-src,data-loading,data-error去設(shè)置圖片的路徑的,我們看內(nèi)部實(shí)現(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)
 })

下面是寫(xiě)好的v-lazy-container demo:

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

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

lazy-component

這個(gè)和上面的不太一樣,這個(gè)嚴(yán)格來(lái)說(shuō)不單單能夠做圖片懶加載,還可以做組件的懶加載,一般結(jié)構(gòu)如下:

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

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

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

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

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

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

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

=> lazy-component demo(二維碼)

注:lazy-component本身不能實(shí)現(xiàn)圖片懶加載,它只是實(shí)現(xiàn)組件懶加載,上面demo真正實(shí)現(xiàn)懶加載是因?yàn)橛昧藇-lazy。lazy-component有一個(gè)問(wèn)題,就是它的上方必須要有東西,否則可能沒(méi)有效果,因?yàn)樗跈z測(cè)的時(shí)候有一個(gè)判斷:bottom>0,所以如果你在第一個(gè)元素使用lazy-component可能沒(méi)有效果。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue中watch、computed、updated三者的區(qū)別及用法

    Vue中watch、computed、updated三者的區(qū)別及用法

    這篇文章主要介紹了Vue中watch、computed、updated三者的區(qū)別及用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • vue+element-ui實(shí)現(xiàn)主題切換功能

    vue+element-ui實(shí)現(xiàn)主題切換功能

    這篇文章主要介紹了vue+element-ui實(shí)現(xiàn)主題切換功能,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Vue下的國(guó)際化處理方法

    Vue下的國(guó)際化處理方法

    下面小編就為大家分享一篇Vue下的國(guó)際化處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 如何快速上手Vuex

    如何快速上手Vuex

    本文主要介紹了Javascript中Vuex的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • vue如何實(shí)現(xiàn)接口統(tǒng)一管理

    vue如何實(shí)現(xiàn)接口統(tǒng)一管理

    這篇文章主要介紹了vue如何實(shí)現(xiàn)接口統(tǒng)一管理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue-router跳轉(zhuǎn)時(shí)打開(kāi)新頁(yè)面的兩種方法

    vue-router跳轉(zhuǎn)時(shí)打開(kāi)新頁(yè)面的兩種方法

    這篇文章主要給大家介紹了關(guān)于vue-router跳轉(zhuǎn)時(shí)打開(kāi)新頁(yè)面的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue-router具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Vue源碼分析之虛擬DOM詳解

    Vue源碼分析之虛擬DOM詳解

    所謂虛擬DOM就是為了解決瀏覽器性能問(wèn)題而被設(shè)計(jì)出來(lái)的。如前,若一次操作中有 10 次更新 這篇文章主要給大家介紹了關(guān)于Vue源碼分析之虛擬DOM的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • Vue前端vue.config.js簡(jiǎn)介

    Vue前端vue.config.js簡(jiǎn)介

    vue.config.js?是一個(gè)可選的配置文件,如果項(xiàng)目的?(和?package.json?同級(jí)的)?根目錄中存在這個(gè)文件,那么它會(huì)被?@vue/cli-service?自動(dòng)加載,本文重點(diǎn)介紹VUE前端vue.config.js簡(jiǎn)介,感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • vue3.0 自適應(yīng)不同分辨率電腦的操作

    vue3.0 自適應(yīng)不同分辨率電腦的操作

    這篇文章主要介紹了vue3.0 自適應(yīng)不同分辨率電腦的操作,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02

最新評(píng)論

南康市| 镇平县| 皮山县| 通榆县| 东兴市| 共和县| 南乐县| 正定县| 永春县| 灯塔市| 洛宁县| 资中县| 周宁县| 保靖县| 甘南县| 嵩明县| 黑山县| 北安市| 克什克腾旗| 南宁市| 麻栗坡县| 莆田市| 千阳县| 凌海市| 阿拉善右旗| 云浮市| 凤阳县| 新竹市| 安仁县| 高平市| 兰考县| 临漳县| 株洲县| 忻城县| 枣强县| 双柏县| 西乡县| 大厂| 天峻县| 平和县| 洛阳市|