微信小程序实战之上拉(分页加载)效果(2)


Posted in Javascript onApril 17, 2017

上拉加载(分页加载) 

当用户打开一个页面时,假设后台数据量庞大时,一次性地返回所有数据给客户端,页面的打开速度就会有所下降,而且用户只看上面的内容而不需要看后面的内容时,也浪费用户流量,基于优化的角度来考虑,后台不要一次性返回所有数据,当用户有需要再往下翻的时候,再加载更加数据出来。 

业务需求:

列表滚动到底部时,继续往上拉,加载更多内容 

必备参数:

(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, // 用于判断searchSongList数组是不是空数组,默认true,空的数组 
 searchPageNum: 1, // 设置加载的第几次,默认是第一次 
 callbackcount: 15,  //返回数据的个数 
 searchLoading: false, //"上拉加载"的变量,默认false,隐藏 
 searchLoadingComplete: false //“没有数据”的变量,默认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 = []; 
  //如果isFromSearch是true从data中取出数据,否则先从原来的数据继续添加 
  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 //把"上拉加载"的变量设为false,显示 
  }); 
  //没有数据了,把“没有数据”显示,把“上拉加载”隐藏 
  }else{ 
  that.setData({ 
   searchLoadingComplete: true, //把“没有数据”设为true,显示 
   searchLoading: false //把"上拉加载"的变量设为false,隐藏 
  }); 
  } 
 }) 
 }, 
 //点击搜索按钮,触发事件 
 keywordSearch: function(e){ 
 this.setData({ 
  searchPageNum: 1, //第一次加载,设置1 
  searchSongList:[], //放置返回数据的数组,设为空 
  isFromSearch: true, //第一次加载,设置true 
  searchLoading: true, //把"上拉加载"的变量设为true,显示 
  searchLoadingComplete:false //把“没有数据”设为false,隐藏 
 }) 
 this.fetchSearchList(); 
 }, 
 //滚动到底部触发事件 
 searchScrollLower: function(){ 
 let that = this; 
 if(that.data.searchLoading && !that.data.searchLoadingComplete){ 
  that.setData({ 
  searchPageNum: that.data.searchPageNum+1, //每次触发上拉事件,把searchPageNum+1 
  isFromSearch: false //触发到上拉事件,把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:

page{ 
 display: flex; 
 flex-direction: column; 
 height: 100%; 
} 
 
/*搜索*/ 
.search{ 
 flex: auto; 
 display: flex; 
 flex-direction: column; 
 background: #fff; 
} 
.search-bar{ 
 flex: none; 
 display: flex; 
 align-items: center; 
 justify-content: space-between; 
 padding: 20rpx; 
 background: #f4f4f4; 
} 
.search-wrap{ 
 position: relative; 
 flex: auto; 
 display: flex; 
 align-items: center; 
 height: 80rpx; 
 padding: 0 20rpx; 
 background: #fff; 
 border-radius: 6rpx; 
} 
.search-wrap .icon-search{ 
 margin-right: 10rpx; 
} 
.search-wrap .search-input{ 
 flex: auto; 
 font-size: 28rpx; 
} 
.search-cancel{ 
 padding: 0 20rpx; 
 font-size: 28rpx; 
} 
 
/*搜索结果*/ 
.search-result{ 
 flex: auto; 
 position: relative; 
} 
.search-result scroll-view{ 
 position: absolute; 
 bottom: 0; 
 left: 0; 
 right: 0; 
 top: 0; 
} 
.result-item{ 
 position: relative; 
 display: flex; 
 flex-direction: column; 
 padding: 20rpx 0 20rpx 110rpx; 
 overflow: hidden; 
 border-bottom: 2rpx solid #e5e5e5; 
} 
 
.result-item .media{ 
 position: absolute; 
 left: 16rpx; 
 top: 16rpx; 
 width: 80rpx; 
 height: 80rpx; 
 border-radius: 999rpx; 
} 
.result-item .title, 
.result-item .subtitle{ 
 overflow: hidden; 
 text-overflow: ellipsis; 
 white-space: nowrap; 
 line-height: 36rpx; 
} 
.result-item .title{ 
 margin-bottom: 4rpx; 
 color: #000; 
} 
.result-item .subtitle{ 
 color: #808080; 
 font-size: 24rpx; 
} 
.result-item:first-child .subtitle text{ 
 margin-right: 20rpx; 
} 
.result-item:not(:first-child) .subtitle text:not(:first-child):before{ 
 content: '/'; 
 margin: 0 8rpx; 
} 
.loading{ 
 padding: 10rpx; 
 text-align: center; 
} 
.loading:before{ 
 display: inline-block; 
 margin-right: 5rpx; 
 vertical-align: middle; 
 content: ''; 
 width: 40rpx; 
 height: 40rpx; 
 background: url(../../images/icon-loading.png) no-repeat; 
 background-size: contain; 
 animation: rotate 1s linear infinite; 
} 
.loading.complete:before{ 
 display: none; 
}

运行:

微信小程序实战之上拉(分页加载)效果(2)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 屏蔽一个区域内的所有元素,禁止输入
Oct 22 Javascript
JavaScript Event学习第四章 传统的事件注册模型
Feb 07 Javascript
JS辨别访问浏览器判断是android还是ios系统
Aug 19 Javascript
jquery实现兼容IE8的异步上传文件
Jun 15 Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
Sep 23 Javascript
vuejs父子组件通信的问题
Jan 11 Javascript
jQuery实现锚点向下平滑滚动特效示例
Aug 29 jQuery
解读vue生成的文件目录结构及说明
Nov 27 Javascript
利用vue + element实现表格分页和前端搜索的方法
Dec 25 Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 Javascript
vue实现在v-html的html字符串中绑定事件
Oct 28 Javascript
Javascript表单序列化原理及实现代码详解
Oct 30 Javascript
微信小程序教程系列之新建页面(4)
Apr 17 #Javascript
微信小程序商城项目之淘宝分类入口(2)
Apr 17 #Javascript
微信小程序商城项目之购物数量加减(3)
Apr 17 #Javascript
微信小程序商城项目之商品属性分类(4)
Apr 17 #Javascript
微信小程序商城项目之侧栏分类效果(1)
Apr 17 #Javascript
Map.vue基于百度地图组件重构笔记分享
Apr 17 #Javascript
JS简单验证上传文件类型的方法
Apr 17 #Javascript
You might like
怎样辨别一杯好咖啡
2021/03/03 新手入门
解析PHP的session过期设置
2013/06/29 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
javascript+canvas制作九宫格小程序
2014/12/28 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
python格式化字符串实例总结
2014/09/28 Python
Python实现批量下载图片的方法
2015/07/08 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
python数字图像处理之骨架提取与分水岭算法
2018/04/27 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
Django之腾讯云短信的实现
2020/06/12 Python
python中使用np.delete()的实例方法
2021/02/01 Python
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
中学生运动会入场词
2014/02/12 职场文书
挂科检讨书范文
2014/02/20 职场文书
安全生产承诺书
2014/03/26 职场文书
活动总结报告怎么写
2014/07/03 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
电影开国大典观后感
2015/06/04 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
MySQL数据库之存储过程 procedure
2022/06/16 MySQL