加載更多(分頁加載)
當用戶打開一個頁面時,假設后臺數據量龐大時,一次性地返回所有數據給客戶端,頁面的打開速度就會有所下降,而且用戶只看上面的內容而不需要看后面的內容時,也浪費用戶流量,基于優化的角度來考慮,后臺不要一次性返回所有數據,當用戶有需要再往下翻的時候,再加載更加數據出來。
業務需求:
列表滾動到底部時,繼續往上拉,加載更多內容
必備參數:
(1)pageindex: 1 //第幾次加載
(2)callbackcount: 15 //需要返回數據的個數
其他參數:
根據接口的所需參數
實現原理:
當第一次訪問接口時,傳遞2個必備參數(第1次加載,需要返回數據的個數為15個),和其他參數(需要搜索的字符串)給后臺,后臺返回第一次數據過來。在請求成功的的回調函數中,判斷返回的數據是否>0,是,則取出數據,渲染視圖層,并把“上拉加載”顯示在列表底部;否,則沒有數據可取,并把“沒有更多”顯示在列表底部,同時把“上拉加載”隱藏掉。
當用戶已經滾動到列表底部(這里使用到小程序提供的scroll-view組件的bindscrolltolower事件),觸發bindscrolltolower事件,參數pageindex+1,再把2個必備參數(第2次加載,需要返回數據的個數為15個)和其他參數(需要搜索的字符串)給后臺,后臺把其余的數據返回給前臺,前臺在原來數據的基礎上添加數據。
示例:
wxml:
-
<view class="search">
-
<view class="search-bar">
-
<view class="search-wrap">
-
<icon type="search" size="16" class="icon-search" />
-
<input type="text" placeholder="請輸入搜索內容" class="search-input" name="searchKeyword" bindinput="bindKeywordInput" value="{{searchKeyword}}" />
-
</view>
-
<view class="search-cancel" bindtap="keywordSearch">搜索</view>
-
</view>
-
<view class="search-result">
-
<scroll-view scroll-y="true" bindscrolltolower="searchScrollLower">
-
<view class="result-item" wx:for="{{searchSongList}}" wx:key="unique" data-data="{{item}}" >
-
<view class="icon{{item.isonly=='0' ? ' nocopyright' : ''}}"></view>
-
<text class="title">{{item.songname}}</text>
-
<view class="subtitle">
-
<text wx:for="{{item.singer}}" wx:key="unique">{{item.name}}</text>
-
</view>
-
</view>
-
<view class="loading" hidden="{{!searchLoading}}">正在載入更多...</view>
-
<view class="loading complete" hidden="{{!searchLoadingComplete}}">已加載全部</view>
-
</scroll-view>
-
</view>
-
</view>
js:
-
var util = require('../../utils/util.js')
-
Page({
-
data: {
-
searchKeyword: '',
-
searchSongList: [],
-
isFromSearch: true,
-
searchPageNum: 1,
-
callbackcount: 15,
-
searchLoading: false,
-
searchLoadingComplete: false
-
},
-
-
bindKeywordInput: function(e){
-
console.log("輸入框事件")
-
this.setData({
-
searchKeyword: e.detail.value
-
})
-
},
-
-
fetchSearchList: function(){
-
let that = this;
-
let searchKeyword = that.data.searchKeyword,
-
searchPageNum = that.data.searchPageNum,
-
callbackcount =that.data.callbackcount;
-
-
util.getSearchMusic(searchKeyword, searchPageNum,callbackcount, function(data){
-
console.log(data)
-
-
if(data.data.song.curnum != 0){
-
let searchList = [];
-
-
that.data.isFromSearch ? searchList=data.data.song.list : searchList=that.data.searchSongList.concat(data.data.song.list)
-
that.setData({
-
searchSongList: searchList,
-
zhida: data.data.zhida,
-
searchLoading: true
-
});
-
-
}else{
-
that.setData({
-
searchLoadingComplete: true,
-
searchLoading: false
-
});
-
}
-
})
-
},
-
-
keywordSearch: function(e){
-
this.setData({
-
searchPageNum: 1,
-
searchSongList:[],
-
isFromSearch: true,
-
searchLoading: true,
-
searchLoadingComplete:false
-
})
-
this.fetchSearchList();
-
},
-
-
searchScrollLower: function(){
-
let that = this;
-
if(that.data.searchLoading && !that.data.searchLoadingComplete){
-
that.setData({
-
searchPageNum: that.data.searchPageNum+1,
-
isFromSearch: false
-
});
-
that.fetchSearchList();
-
}
-
}
-
})
util.js:
-
function getSearchMusic(keyword, pageindex, callbackcount, callback){
-
wx.request({
-
url: 'https://c.y.qq.com/soso/fcgi-bin/search_for_qq_cp',
-
data: {
-
g_tk: 5381,
-
uin: 0,
-
format: 'json',
-
inCharset: 'utf-8',
-
outCharset: 'utf-8',
-
notice: 0,
-
platform: 'h5',
-
needNewCode: 1,
-
w: keyword,
-
zhidaqu: 1,
-
catZhida: 1,
-
t: 0,
-
flag: 1,
-
ie: 'utf-8',
-
sem: 1,
-
aggr: 0,
-
perpage: 20,
-
n: callbackcount,
-
p: pageindex,
-
remoteplace: 'txt.mqq.all',
-
_: Date.now()
-
},
-
method: 'GET',
-
header: {'content-Type': 'application/json'},
-
success: function(res){
-
if(res.statusCode == 200){
-
callback(res.data);
-
}
-
}
-
})
-
}
-
-
module.exports = {
-
getSearchMusic: getSearchMusic
-
}
wxss:
運行:
