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

一個一個來吧。

服務(wù)器端分頁

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

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

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

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

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

小程序端

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

關(guān)于上拉加載

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

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

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

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

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

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

看看下圖的改造

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

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

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

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

為此我們來增加一個新變量 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ù)時候,如果發(fā)現(xiàn)hadLastPage不是false,則直接提示到底了,不再去后臺獲取數(shù)據(jù)。

關(guān)于下拉刷新

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

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

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

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

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

總結(jié)

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

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

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