加载更多(分页加载)
当用户打开一个页面时,假设后台数据量庞大时,一次性地返回所有数据给客户端,页面的打开速度就会有所下降,而且用户只看上面的内容而不需要看后面的内容时,也浪费用户流量,基于优化的角度来考虑,后台不要一次性返回所有数据,当用户有需要再往下翻的时候,再加载更加数据出来。
业务需求:
列表滚动到底部时,继续往上拉,加载更多内容
必备参数:
(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:
运行:
