眾所周知,前端開(kāi)發(fā)中滑動(dòng)加載是一個(gè)非常重要的功能,它可以幫助我們解決傳統(tǒng)分頁(yè)加載的煩惱,提高頁(yè)面的流暢性和用戶(hù)體驗(yàn)。而Vue.js作為一種非常流行的前端框架,如何使用Vue來(lái)實(shí)現(xiàn)滑動(dòng)加載呢?
實(shí)現(xiàn)滑動(dòng)加載主要分為兩步:1. 監(jiān)聽(tīng)滾動(dòng)事件;2. 動(dòng)態(tài)加載數(shù)據(jù)。我們先從監(jiān)聽(tīng)滾動(dòng)事件開(kāi)始講起。Vue提供了一個(gè)很方便的指令v-on,可以監(jiān)聽(tīng)DOM事件。在監(jiān)聽(tīng)滾動(dòng)事件時(shí),我們可以使用v-on指令和scroll事件,如下:
data() {
return {
page: 1,
limit: 10,
list: []
}
},
mounted() {
window.addEventListener('scroll', this.handleScroll)
},
methods: {
handleScroll() {
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop
let clientHeight = document.documentElement.clientHeight
let scrollHeight = document.documentElement.scrollHeight
if (scrollTop + clientHeight >= scrollHeight) {
this.loadMore()
}
},
async loadMore() {
this.page++
let res = await fetch(`/api/list?page=${this.page}&limit=${this.limit}`)
let data = await res.json()
this.list = this.list.concat(data.list)
}
}
上述代碼定義了三個(gè)數(shù)據(jù)項(xiàng)page(當(dāng)前頁(yè)碼)、limit(每頁(yè)限制數(shù)量)和list(列表數(shù)據(jù)),以及兩個(gè)方法handleScroll(滾動(dòng)事件處理函數(shù))和loadMore(動(dòng)態(tài)加載數(shù)據(jù)函數(shù))。在mounted函數(shù)中,我們使用window.addEventListener監(jiān)聽(tīng)scroll事件,當(dāng)滾動(dòng)到底部時(shí),調(diào)用loadMore函數(shù)來(lái)動(dòng)態(tài)加載下一頁(yè)數(shù)據(jù)。
handleScroll函數(shù)用來(lái)判斷是否滾動(dòng)到頁(yè)面底部。首先獲取當(dāng)前頁(yè)面滾動(dòng)的距離scrollTop、頁(yè)面可視區(qū)域高度clientHeight和頁(yè)面總高度scrollHeight,如果scrollTop + clientHeight >= scrollHeight,則表示滾動(dòng)到底部,可以觸發(fā)loadMore函數(shù)加載更多數(shù)據(jù)。
loadMore函數(shù)用async/await異步方式請(qǐng)求服務(wù)器端數(shù)據(jù),并把新數(shù)據(jù)合并到當(dāng)前列表中。由于Vue的數(shù)據(jù)響應(yīng)式特性,這里只需要更新list數(shù)據(jù),頁(yè)面就會(huì)自動(dòng)更新。
要注意的是,我們一般會(huì)在頁(yè)面銷(xiāo)毀時(shí)移除事件監(jiān)聽(tīng)器,以避免內(nèi)存泄漏。在Vue中,可以在beforeDestroy鉤子函數(shù)中移除事件監(jiān)聽(tīng)器:
beforeDestroy() {
window.removeEventListener('scroll', this.handleScroll)
}
如此,我們便完成了滑動(dòng)加載功能。