微信小程序:上拉加載更多

無論是微信小程序還是其他前端框架,都會遇到上拉加載(懶加載)和下拉刷新這種問題。其實理清楚什么時候請求數(shù)據(jù)、請求返回的幾種情況,那么做這個懶加載就很簡單了。

一、首先,固定一個包含列表數(shù)據(jù)的view高度,讓它里面列表的數(shù)據(jù)溢出可以滾動:
  <scroll-view scroll-y lower-threshold="100" bindscrolltolower="scrollToLower" style="height: 100vh;">
    <view wx:for="{{listData}}" wx:key="{{index}}" style="height: 40px;line-height: 40px;border-bottom: 1px solid #f4f4f4;">
      Item{{item}}
    </view>
  </scroll-view>
二、那么列表的數(shù)據(jù)請求就會分成兩種情況:一種是初始化頁面加載的第一頁的數(shù)據(jù);一種是滾動到底部請求的下一頁的數(shù)據(jù)。所以我們在請求時要分成兩種情況,若是第一頁,isPage=false,下一頁的數(shù)據(jù)isPage=true
//請求數(shù)據(jù)
  getData(isPage) {
    console.log("需要拼接數(shù)據(jù):", Network.pageData);
    let params = {
      pageNum: this.data.pageNo,
      pageSize: 30
    }
    //請求
    Network.pageData(params,(res,err)=>{
      if (isPage) {
          //下一頁的數(shù)據(jù)拼接在原有數(shù)據(jù)后面
          this.setData({
            listData: this.data.listData.concat(res.result)
          })
        } else {
          //第一頁數(shù)據(jù)直接賦值
          this.setData({
            listData: res.result
          })
        }
    })
  },
三、步驟一提到的固定高度的view,它在往上滾動的時候,滾動到一定的位置便請求下一頁的數(shù)據(jù)。我這里設(shè)置了當view距離到底部還有100px時,觸發(fā)請求下一頁的數(shù)據(jù):
//到達底部
  scrollToLower: function (e) {
      this.setData({
        pageNo: this.data.pageNo + 1
      })
      this.getData(true);
  },
四、以上便是基本的上拉加載。通過以上步驟會出現(xiàn)幾個問題,下面提供解決方法:

1、滾動離底部<100px之后,繼續(xù)往底部滾動會一直發(fā)起請求。我們需要在view距離到底部還有100px時,設(shè)置一個全局變量loading,告訴大家我已經(jīng)發(fā)起請求了,等我請求返回的數(shù)據(jù)展示到頁面之后才可以再次發(fā)起請求。將步驟三的代碼改成以下:

//到達底部
  scrollToLower: function (e) {
    if (!this.data.loading){
      this.setData({
        loading: true,
        pageNo: this.data.pageNo + 1
      })
      this.getData(true);
    }
  },

步驟二的代碼改為:

//請求數(shù)據(jù)
  getData(isPage) {
    console.log("需要拼接數(shù)據(jù):", Network.pageData);
    let params = {
      pageNum: this.data.pageNo,
      pageSize: 30
    }
    //請求
    Network.pageData(params,(res,err)=>{
      this.setData({
        loading: false
      })
      if (isPage) {
          //下一頁的數(shù)據(jù)拼接在原有數(shù)據(jù)后面
          this.setData({
            listData: this.data.listData.concat(res.result)
          })
        } else {
          //第一頁數(shù)據(jù)直接賦值
          this.setData({
            listData: res.result
          })
        }
    })
  },

2、如果最后一頁的數(shù)據(jù)都請求完了,再繼續(xù)往下滾動還會發(fā)起請求。設(shè)置一個全局變量noMore,當我請求返回的數(shù)組長度為0時,滾動到底部就不用再發(fā)起請求了。將步驟三的代碼改成以下:

//到達底部
  scrollToLower: function (e) {
    if (!this.data.loading && !this.data.noMore){
      this.setData({
        loading: true,
        pageNo: this.data.pageNo + 1
      })
      this.getData(true);
    }
  },

步驟二的代碼改為:

//請求數(shù)據(jù)
  getData(isPage) {
    console.log("需要拼接數(shù)據(jù):", Network.pageData);
    let params = {
      pageNum: this.data.pageNo,
      pageSize: 30
    }
    //請求
    Network.pageData(params,(res,err)=>{
      this.setData({
        loading: false
      })
       if (isPage) {
          //下一頁的數(shù)據(jù)拼接在原有數(shù)據(jù)后面
          this.setData({
            listData: this.data.listData.concat(res.result)
          })
        } else {
          //第一頁數(shù)據(jù)直接賦值
          this.setData({
            listData: res.result
          })
        }
        //如果返回的數(shù)據(jù)為空,那么就沒有下一頁了
        if (res.result.length == 0) {
          this.setData({
            noMore: true
          })
        }
    })
  },
五、我們接下來完善請求失敗的情況,步驟二的代碼改為:
//請求數(shù)據(jù)
  getData(isPage) {
    console.log("需要拼接數(shù)據(jù):", Network.pageData);
    let params = {
      pageNum: this.data.pageNo,
      pageSize: 30
    }
    //請求
    Network.pageData(params,(res,err)=>{
      this.setData({
        loading: false
      })
      if (err) {//返回失敗
        this.setData({
          loadingFailed: true
        })
        return false;
      }
      if (res.code == 0) {
        if (isPage) {
          //下一頁的數(shù)據(jù)拼接在原有數(shù)據(jù)后面
          this.setData({
            listData: this.data.listData.concat(res.result)
          })
        } else {
          //第一頁數(shù)據(jù)直接賦值
          this.setData({
            listData: res.result
          })
        }
        //如果返回的數(shù)據(jù)為空,那么就沒有下一頁了
        if (res.result.length == 0) {
          this.setData({
            noMore: true
          })
        }
      } else {
        //返回失敗
        this.setData({
          loadingFailed: true
        })
      }
    })
  },
步驟一的HTML代碼修改如下:
  <scroll-view scroll-y lower-threshold="100" bindscrolltolower="scrollToLower" style="height: 100vh;">
    <view wx:for="{{listData}}" wx:key="{{index}}" style="height: 40px;line-height: 40px;border-bottom: 1px solid #f4f4f4;">
      Item{{item}}
    </view>
    <view style="text-align: center;margin: 10px;">
      <view wx:if="{{loading}}">加載中...</view>
      <view wx:if="{{noMore}}">沒有更多了</view>
      <view wx:if="{{loadingFailed}}">數(shù)據(jù)加載失敗,請重試</view>
    </view>
  </scroll-view>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,621評論 1 32
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 28,774評論 1 45
  • 無論是微信小程序還是其他前端框架,都會遇到上拉加載(懶加載)和下拉刷新這種問題。其實理清楚什么時候請求數(shù)據(jù)、請求返...
    Lucia_Huang閱讀 1,537評論 0 0
  • 胡理樂 邵靜先 昨夜狂風肆虐,一個人躲在被窩里,不敢伸出頭去,在北師大特有的烏?聲中,渾身直凍得瑟瑟發(fā)抖,可不知不...
    快樂爸爸日記閱讀 680評論 0 1
  • 好久沒在這留下足跡了,想寫的東西好多,一直不知道從何下筆,就這樣一拖再拖的…… 今天,聽著朋友的聊...
    阿勇的故事閱讀 312評論 1 0

友情鏈接更多精彩內(nèi)容