下拉刷新和上拉加載是兩個(gè)獨(dú)立又密切聯(lián)系的功能,上拉加載需要服務(wù)器端有分頁機(jī)制,而下拉刷新除了重新獲取信息外還要對之前的狀態(tài)和頁碼進(jìn)行初始化。

一個(gè)一個(gè)來吧。

服務(wù)器端分頁

其實(shí)yii2早就已經(jīng)為我們準(zhǔn)備好了,當(dāng)我們訪問了GET /xcx/albums的時(shí)候,返回的其實(shí)是一個(gè)帶有分頁信息的json,如果你對yii2很熟悉,一定知道activeDataProvider本身就是帶分頁功能的,默認(rèn)每頁20條數(shù)據(jù)。

我們再來回顧一下GET /xcx/albums的返回

沒錯(cuò),在響應(yīng)的header里你一定發(fā)現(xiàn)了上面四條數(shù)據(jù),就是它們,每次接口的返回其實(shí)yii2已經(jīng)告訴了我們當(dāng)前的頁碼、一共多少頁、每頁的數(shù)據(jù)量以及一共多少條數(shù)據(jù)。

OMG,這不就是我們想要的么?~~~~

好,那就簡單了,我們只需要在接口處增加page參數(shù)告訴我們要請求那一頁就可以了。

小程序端

現(xiàn)在知道后臺(tái)已經(jīng)能按照頁碼返回?cái)?shù)據(jù)了,接下來就是小程序,對于移動(dòng)應(yīng)用一般不會(huì)是直接顯示頁碼然后點(diǎn)擊,更多是隨著我們屏幕的下滑逐漸出現(xiàn)新的內(nèi)容,就是所謂的上拉加載。當(dāng)然還有個(gè)下拉刷新,這個(gè)本章最后一部分進(jìn)行講解。

關(guān)于上拉加載

上拉加載主要利用了js的onReachBottom函數(shù),它表示“頁面上拉觸底事件的處理函數(shù)”,我們就在這一刻從后臺(tái)獲取新的數(shù)據(jù)并且添加到現(xiàn)有頁面下方。

首先我需要在小程序頁面定義一個(gè)變量(page)代表即將要獲取第幾頁,然后再定義一個(gè)獲取后臺(tái)數(shù)據(jù)的函數(shù)就可以了,記住這個(gè)獲取是要帶頁面參數(shù)的。

為此我獨(dú)立出一個(gè)函數(shù)專門做信息獲取這件事情,如下圖

不知道你是否看明白,在onReady函數(shù)內(nèi)我們完成了數(shù)據(jù)的先進(jìn)次加載。當(dāng)然也許你更關(guān)心的是N+1次加載的事情,接下來我們就來實(shí)現(xiàn)它,啟動(dòng)onReachBottom函數(shù)。

試想一下當(dāng)我們獲取了先進(jìn)頁以后,頁面下來到底部我們需要獲取第二頁,此刻page參數(shù)應(yīng)該2,為此我們需要對loadList做一次小手術(shù),這次手術(shù)完成了兩件事情。

  • 對page的賦值
  • 對現(xiàn)有數(shù)據(jù)和新數(shù)據(jù)的合并

看看下圖的改造

當(dāng)從后臺(tái)獲取數(shù)據(jù)后進(jìn)行循環(huán),然后添加現(xiàn)有的數(shù)據(jù)數(shù)組中,就像上圖的綠色框框內(nèi)的代碼一樣。合并數(shù)據(jù)后執(zhí)行page++供下一次使用。

而每次頁面到底部的時(shí)候都進(jìn)行一個(gè)onReachBottom函數(shù),它執(zhí)行了loadList。

就這樣每次到底部都向后臺(tái)要數(shù)據(jù)

疑問來了?????是的,先進(jìn)個(gè)問題就是page到什么時(shí)候是個(gè)頭,按照上面的邏輯會(huì)一直遞增,然后獲取數(shù)據(jù),這顯然是邏輯錯(cuò)誤的,我們應(yīng)該告訴小程序一共有多少頁,當(dāng)頁面達(dá)到數(shù)量后就不在獲取數(shù)據(jù)了。

為此我們來增加一個(gè)新變量 hadLastPage = false,默認(rèn)代表還沒有到達(dá)最后一頁,然后繼續(xù)改造loadList,在這里用到了yii2給我們響應(yīng)header中的那些數(shù)據(jù),看下圖

邏輯不復(fù)雜,紅色框內(nèi)的意思是判斷yii2的數(shù)據(jù)返回,如果當(dāng)前頁數(shù)已經(jīng)等于總頁數(shù)說明最后一頁了,則設(shè)置hadLastPage=當(dāng)前頁數(shù),否則page++

另外在函數(shù)最前端進(jìn)行了一次判斷,調(diào)用此函數(shù)時(shí)候,如果發(fā)現(xiàn)hadLastPage不是false,則直接提示到底了,不再去后臺(tái)獲取數(shù)據(jù)。

關(guān)于下拉刷新

小程序?qū)ο吕⑿率怯幸欢ㄖС值?,那就是json文件里的enablePullDownRefresh參數(shù),當(dāng)你如下設(shè)置enablePullDownRefresh時(shí)候

另外當(dāng)我們設(shè)置了enablePullDownRefresh=true后會(huì)觸發(fā)js文件中的onPullDownRefresh函數(shù),你可以在里面做要做的事情,比如對頁面的初始化,對數(shù)據(jù)列表的清空等等。

在上文我們已經(jīng)完成了數(shù)據(jù)的上拉加載,接下來開始具體編寫onPullDownRefresh函數(shù)。

一系列的初始化,記得最后執(zhí)行一次wx.stopPullDownRefresh();將下拉關(guān)閉,否則那些小點(diǎn)點(diǎn)是不會(huì)消失的。

小提示:下拉刷新的樣式在一定程度上也可以通過backgroundColor和backgroundTextStyle改變,比如你可以做一個(gè)下拉后背景是褐色,小點(diǎn)點(diǎn)是亮色的感覺。

總結(jié)

以上就是下拉刷新和上拉加載,這只是其中一種思路,聰明的你一定會(huì)有更有趣的實(shí)現(xiàn),可以留言此貼讓我看到。

現(xiàn)在實(shí)現(xiàn)了相冊的加載,但是這些數(shù)據(jù)都是假的,下一篇我們是實(shí)現(xiàn)新建和編輯相冊,你也將學(xué)習(xí)到如何使用小程序的表單功能。

另外代碼已經(jīng)同步到了github上,歡迎下載同步學(xué)習(xí) https://github.com/abei2017/xgh