UNI-APP上拉分段加載數據


背景:

  測試APP時,發現列表數據上拉加載有毛病,要么顯示不了所有數據,要么顯示的數據有重復。經查看,是獲取數據的API有分頁參數(page和size),但是只是分頁,而不是分段。換句話說,查詢第二頁的數據會連同第一頁的數據一起返回,為了鍛煉自己,決定從有瑕疵的前端解決這個問題。

思路:

1、獲取數據的分段處理

  (1)無數據

  • 不顯示加載狀態欄
  • 顯示無數據信息提示

  (2)有數據

  • 動態設置API參數取值

    加載數據時動態改變API參數值,這里設置time來控制,追加數據時time++,確保查詢的追加數據條數比上次獲取的數據多十條。

  • 分段截取數據

    以index為索引連續抽取十條數據放進定義的數組listArr(相當於中轉器)中,根據reload值判斷數據是第一次加載還是再次加載(這里統一說成追加數據)

  • 組合分段數據顯示

    將截取的追加數據和第一次加載的數據連接起來賦給最終list,通過template中的v-for循環顯示在客戶端

2、加載狀態切換處理

  (1)渲染初加載完頁面設置為‘上拉加載更多’

  (2)上拉到底設置為‘加載中’,這里通過判斷是否為追加數據進行設置

  (3)數據加載完畢設置為‘沒有更多’

    根據傳遞的條數值size和實際得到數據長度之差來判斷數據是否加載完畢,如果不為0則表示加載完畢,此時設置loadingFlag控制上拉到底時不再觸發數據加載

代碼:

<template>
      <view class="">
            <view class="tishiXinxi" v-if="anzhuangXinxi">
                  沒有現場安裝申請信息
            </view>
            <view class="apply_list_box" v-for='(item,index) in list' :key="index">
                  <view class="apply_list">
                        <image class="photo_head" src="/static/qingjia_bg.png" mode=""></image>
                        <view class="apply_list_text">
                              <view class="text_1">{{item.processDefinitionName}}</view>
                              <button type="primary" @tap="riZhi" :data-id='item.id'>流程日志</button>
                              <view class="text_2">{{item.startTime}}</view>
                        </view>
                  </view>
                  <view class="xiaoxi_line"></view> 
            </view>
            <uni-load-more :status="status" :content-text="contentText" /><!-- 加載列表 -->
      </view>
</template>

<script>
import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue';
var app = getApp();
export default {
      data() {
            return {
                  proInstId: '',
                  templateId:'',
                  last_id: '',
                  list:[],
                  anzhuangXinxi:false,
                  reload:true,//判斷是否為第一輪加載,以便賦予index值
                  time:2,//該值是為了動態更新向服務器傳遞的參數值
                  index:0,//為獲取的數據進行分段處理,十條數據一加載
                  loadingFlag:true,//判斷是否繼續上拉加載數據
                  status: 'more',//加載狀態
                  contentText: {
                        contentdown: '上拉加載更多',
                        contentrefresh: '加載中',
                        contentnomore: '沒有更多'
                  }
            };
      },
      onLoad(option) {
            this.templateId = option.templateId;
      },
      onShow(){
            this.getList();
      },
      onReachBottom() {
            if(this.loadingFlag==true){
                  this.status = 'more';
                  this.getList();
            }
      },
      methods: {
            getList: function(){
                  var that = this;
                  var Authorization = app.globalData.Authorization;
                  const data = {
                        '流程模板key':'process_setup',
                        page:1,
                        size:10
                  };
                  if (that.last_id) {
                        //說明已有數據,目前處於上拉加載
                        that.status = 'loading';
                        data.size = 10*that.time;
                        that.time++;
                  }
                  console.log("data:"+JSON.stringify(data));
                  this.$servers
                        .globalRequest('actApi/my', 'POST', data, Authorization)//此處封裝了AJAX,只要能獲取到接口數據,怎樣都成
                        .then(res => {
                              let listData = res.data.data;
                              console.log("listData:"+listData.length);
                              var num = data.size-listData.length;
                              var listArr= [];
                              if(that.reload==true && listData.length==0){
                                    that.anzhuangXinxi = true;
                                    that.contentText = '';
                                    return false;
                              }else{
                                    if(that.reload==false){
                                          that.index +=10;
                                    }
                                    if(num!=0){
                                          that.status = 'noMore';
                                          that.loadingFlag = false;
                                    }
                                    for(var j=that.index;j<(that.index+10>=listData.length?listData.length:that.index+10);j++){
                                          listArr.push(listData[j]);
                                    }
                                    that.last_id = listArr[listArr.length-1].id;
                                    that.list = that.reload ? listArr : that.list.concat(listArr);
                                    that.list.sort(function(a, b) {
                                          return a.startTime < b.startTime ? 1 : -1;
                                    });
                                          this.reload = false;
                                    }
                              })
                        .catch(parmas => {});
                  }
            }
      };
</script>

總結:

大神都推薦輸出學習法,如今一試發現自己更菜了:在實現這一功能的過程中,腦子里想了很多東西,感覺很復雜,實現后成就感滿滿,現在將思路重新捋了捋,折成文字也就幾百個字,真是汗顏。不過把思路整理出來也蠻有滿足感的,繼續堅持哈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM