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

一個一個來吧。

服務器端分頁

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

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

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

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

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

小程序端

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

關于上拉加載

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

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

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

不知道你是否看明白,在onReady函數內我們完成了數據的先進次加載。當然也許你更關心的是N+1次加載的事情,接下來我們就來實現它,啟動onReachBottom函數。

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

  • 對page的賦值
  • 對現有數據和新數據的合并

看看下圖的改造

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

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

就這樣每次到底部都向后臺要數據

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

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

邏輯不復雜,紅色框內的意思是判斷yii2的數據返回,如果當前頁數已經等于總頁數說明最后一頁了,則設置hadLastPage=當前頁數,否則page++

另外在函數最前端進行了一次判斷,調用此函數時候,如果發(fā)現hadLastPage不是false,則直接提示到底了,不再去后臺獲取數據。

關于下拉刷新

小程序對下拉刷新是有一定支持的,那就是json文件里的enablePullDownRefresh參數,當你如下設置enablePullDownRefresh時候

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

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

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

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

總結

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

現在實現了相冊的加載,但是這些數據都是假的,下一篇我們是實現新建和編輯相冊,你也將學習到如何使用小程序的表單功能。

另外代碼已經同步到了github上,歡迎下載同步學習 https://github.com/abei2017/xgh