微信小程序?qū)崿F(xiàn)瀑布流分頁(yè)滾動(dòng)加載
本文實(shí)例為大家分享了微信小程序?qū)崿F(xiàn)瀑布流分頁(yè)滾動(dòng)加載的具體代碼,供大家參考,具體內(nèi)容如下
兩種分頁(yè)方式
普通的分頁(yè)效果會(huì)在頁(yè)面底部提供點(diǎn)擊下一頁(yè)和上一頁(yè)的按鈕,在點(diǎn)擊了按鈕之后才會(huì)觸發(fā)調(diào)取數(shù)據(jù)的接口,這種方式的用戶體驗(yàn)一般
另一種分頁(yè)效果不需要用戶點(diǎn)擊按鈕,只要瀏覽到當(dāng)前頁(yè)面的后幾條數(shù)據(jù)時(shí),系統(tǒng)會(huì)自動(dòng)發(fā)送請(qǐng)求獲取后一頁(yè)的數(shù)據(jù),并展示到頁(yè)面上,這樣就可以實(shí)現(xiàn)類似無(wú)限滾動(dòng)的效果
以csdn為例,當(dāng)滾動(dòng)條到達(dá)這個(gè)地方時(shí),會(huì)自動(dòng)調(diào)用請(qǐng)求下一頁(yè)數(shù)據(jù)的接口,然后累加到加載完成的數(shù)據(jù)列表中

實(shí)現(xiàn)思路
滾動(dòng)分頁(yè)的方式存在一個(gè)問(wèn)題,當(dāng)用戶滾動(dòng)的非常快時(shí),可能會(huì)導(dǎo)致第一次請(qǐng)求還未完成,第二次請(qǐng)求就開(kāi)始了,為了避免這個(gè)問(wèn)題,我們可以加入一個(gè)鎖標(biāo)識(shí),發(fā)送一次請(qǐng)求后加鎖,請(qǐng)求完成后釋放鎖,這樣就可以完美避免這種問(wèn)題
得出實(shí)現(xiàn)思路
1、判斷是否還有可加載的數(shù)據(jù)
2、獲取鎖
3、發(fā)送請(qǐng)求,調(diào)用接口
4、釋放鎖
5、返回?cái)?shù)據(jù)

代碼實(shí)現(xiàn)
首先我們需要一個(gè)paging對(duì)象
class Paging{
page //記錄當(dāng)前頁(yè)碼
count //記錄一頁(yè)顯示的數(shù)量
req //接口請(qǐng)求對(duì)象(此處我已封裝,可按照自己需求定義屬性)
url //請(qǐng)求路徑
moreData = true //是否存在下一頁(yè)數(shù)據(jù)(首次請(qǐng)求時(shí)默認(rèn)存在下一頁(yè)數(shù)據(jù))
accumulator = [] //已加載的數(shù)據(jù)列表
locker = false //鎖標(biāo)識(shí)
}
為paging對(duì)象定義一個(gè)構(gòu)造器,默認(rèn)從第一頁(yè)開(kāi)始請(qǐng)求,每頁(yè)五條數(shù)據(jù)
constructor(req, page=0, count=5){
this.page = page
this.count = count
this.req = req
this.url = req.url
}
接下來(lái)編寫getMoreData方法
getMoreData(){
//1、判斷是否存在下一頁(yè)數(shù)據(jù)
//2、獲取鎖,判斷鎖是否為釋放狀態(tài)
//3、請(qǐng)求數(shù)據(jù)
//4、釋放鎖
}
1、判斷是否存在下一頁(yè)數(shù)據(jù)
這里直接獲取moreData屬性進(jìn)行判斷
if(!this.moreData){
return
}
2、獲取鎖
此處新增一個(gè)方法,如果當(dāng)前沒(méi)有鎖,代表可以繼續(xù)請(qǐng)求數(shù)據(jù),在請(qǐng)求數(shù)據(jù)前先把鎖標(biāo)識(shí)設(shè)置為true,防止下次請(qǐng)求繼續(xù)發(fā)送
_getLocker(){
if(this.locker){
return false
}
this.locker = true
return true
}
3、請(qǐng)求數(shù)據(jù)
我們需要返回給頁(yè)面的數(shù)據(jù)結(jié)構(gòu)如下:
{
empty, //是否為空
items, //當(dāng)前頁(yè)數(shù)據(jù)
moreData, //是否存在下一頁(yè)數(shù)據(jù)
accumulator //已經(jīng)請(qǐng)求過(guò)的所有數(shù)據(jù)
}
首先定義一個(gè)獲取請(qǐng)求結(jié)構(gòu)的方法
_getCurrentReq(){
let url = this.url
//設(shè)置請(qǐng)求參數(shù)
const params = `page=${this.page}&count=${this.count}`
//判斷拼接方式
if(url.includes('?')){
url += '&' + params
}else{
url += '?' + params
}
this.req.url = url
return this.req
}
獲取數(shù)據(jù)的方法如下:
_actualGetData(){
const req = this._getCurrentReq() //獲取到具體的請(qǐng)求內(nèi)容
let paging = Http.request(req) //調(diào)用自定義工具中的請(qǐng)求方法,進(jìn)行數(shù)據(jù)的獲取
//如果沒(méi)有獲取到結(jié)果直接返回null
if(!paging){
return null
}
if(paging.total === 0){
return {
empty: true,
items: [],
moreData: false,
accumulator: []
}
}
//如果當(dāng)前頁(yè)碼數(shù)小于總頁(yè)碼數(shù)表示還存在下一頁(yè)數(shù)據(jù),設(shè)置moreData為true,否則設(shè)置為false
this.moreData = pageNum < totalPage-1 ? true : false
//如果存在下頁(yè)數(shù)據(jù),將page+1,便于下次的獲取
if(this.moreData){
this.page += 1
}
//因瀑布流顯示數(shù)據(jù)需要累加展示,所以數(shù)據(jù)列表也需要累加
this.accumulator = this.accumulator.concat(paging.items)
return{
empty: false,
items: paging.items,
moreData: this.moreData,
accumulator: this.accumulator
}
}
4、釋放鎖
釋放鎖直接將鎖標(biāo)識(shí)的狀態(tài)改變即可
this.locker = false
getMoreData方法編寫完畢,然后就可以在對(duì)應(yīng)界面的js文件中進(jìn)行調(diào)用了
在第一次進(jìn)入界面時(shí),需要自動(dòng)調(diào)用一次,然后在用戶每次觸底時(shí)再次調(diào)用
initBottomSpuList(){
//獲取到paging對(duì)象
const paging = new Paging({
url: url
})
//將paging對(duì)象存入js的data中
this.data.spuPaging = paging
//調(diào)用方法
const data = paging.getMoreData()
if(!data){
return
}
//重新加載瀑布流
wx.lin.renderWaterFlow(data.items)
},
微信小程序有自帶的觸底時(shí)自動(dòng)觸發(fā)的函數(shù),將方法調(diào)用的代碼寫入這個(gè)函數(shù)即可
onReachBottom: function () {
const data = this.data.spuPaging.getMoreData()
if(!data){
return
}
//重新加載瀑布流
wx.lin.renderWaterFlow(data.items)
}
至此,就可以實(shí)現(xiàn)瀑布流分頁(yè)滾動(dòng)加載的效果了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序中插入激勵(lì)視頻廣告并獲取收益(實(shí)例代碼)
這篇文章主要介紹了微信小程序中插入激勵(lì)視頻廣告并獲取收益,通過(guò)代碼給大家介紹了如何插入及注意事項(xiàng),需要的朋友可以參考下2019-12-12
微信小程序自定義組件傳值 頁(yè)面和組件相互傳數(shù)據(jù)操作示例
這篇文章主要介紹了微信小程序自定義組件傳值 頁(yè)面和組件相互傳數(shù)據(jù)操作,結(jié)合實(shí)例形式分析了微信小程序常見(jiàn)傳值操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-05-05
微信小程序自定義菜單切換欄tabbar組件代碼實(shí)例
這篇文章主要介紹了微信小程序自定義菜單切換欄tabbar組件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
JavaScript進(jìn)制數(shù)之間的互相轉(zhuǎn)換
這篇文章主要介紹了JavaScript進(jìn)制數(shù)之間的互相轉(zhuǎn)換,進(jìn)制轉(zhuǎn)換是人們利用符號(hào)來(lái)計(jì)數(shù)的方法,下文基于JavaScript實(shí)現(xiàn)進(jìn)制數(shù)之間的轉(zhuǎn)換,有一定的知識(shí)性參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
js前端頁(yè)面用插件docx-preview展示docx文件
這篇文章主要給大家介紹了如何使用docx-preview.min.js插件在頁(yè)面上展示.docx文件,并說(shuō)明了該插件依賴于jszip.min.js插件,通過(guò)實(shí)例展示了如何實(shí)現(xiàn)這一功能,需要的朋友可以參考下2024-11-11
淺談如何優(yōu)雅處理JavaScript異步錯(cuò)誤
這篇文章主要介紹了淺談如何優(yōu)雅處理JavaScript異步錯(cuò)誤,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
js獲取select默認(rèn)選中的Option并不是當(dāng)前選中值
這篇文章主要介紹了js如何獲取select默認(rèn)選中的Option并不是當(dāng)前選中的值,需要的朋友可以參考下2014-05-05
JS實(shí)用的動(dòng)畫彈出層效果實(shí)例
這篇文章主要介紹了JS實(shí)用的動(dòng)畫彈出層效果,實(shí)例分析了javascript實(shí)現(xiàn)動(dòng)畫效果彈出層的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05
淺析微信小程序自定義日歷組件及flex布局最后一行對(duì)齊問(wèn)題
這篇文章主要介紹了微信小程序自定義日歷組件及flex布局最后一行對(duì)齊問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10

