仔細思考過解耦性和優雅性以後,發現能夠借鑑一下以前使用過的vue-lazyload的設計思路,此文章即解析一下vue-lazyload的簡要設計思路。
html
接下來帶着這個基本思路來看vue-layload的實現.
vue
src/index.js
git
能夠看出來經過Lazy和LazyClass獲得了lazy這個對象,v-lazy指令對應的幾個回調函數:bind、update、componentUpdated和unbind分別綁定的是lazy對象的add、update、lazyLoadHandler和remove方法。github
src/lazy.js
數組
能夠看到lazy.js文件導出了一個方法,該方法又返回了一個Lazy類,這麼寫的緣由是爲了造成閉包來繼續在Lazy類中引用Vue。下面看Lazy類的構造函數:
瀏覽器
順着剛剛src/index.js的思路繼續往下看指令bind回調函數發生了什麼:閉包
接着看_addListenerTarget方法發生了什麼:
dom
src/lazy.js
ide
src/lazy.js
函數
能夠看到給scrollParent監聽了this.options.ListenEvents裏面的全部事件,事件回調函數爲lazyLoadHandler。
在前面已經說過了lazyLoadHandler的初始化:
src/lazy.js
lazyLoadHandler方法就是_lazyLoadHandler加了一個節流包裝後返回的函數。
繼續看_lazyLoadHandler的實現:
src/lazy.js
能夠看到_lazyLoadHandler方法裏是遍歷了ListenerQueue數組,而且調用每一個listener的checkInView,若是checkInView返回true則調用listener.load;此時其實能夠猜到checkInView是在檢查該listener對應的dom元素是否在可視區域內,listener.load方法是在請求真正的image。
因此梳理一下,vue-lazyload的簡要設計思想能夠如圖所示
理清總體思路,分析源碼就很清晰了,切忌陷入無窮的細節中。