微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析


Posted in Javascript onNovember 27, 2017

本文实例讲述了微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法。分享给大家供大家参考,具体如下:

微信小程序为2017年1月9日打下了一个特殊的标签,迅速刷爆了网络和朋友圈,最近我也写了一个demo程序体验一把。微信小程序和vuejs有些像,都是数据驱动视图&单向数据绑定,而其体验要比H5页面好很多,这得益于微信环境的支持以及首次运行时同时加载所有页面的处理。本文将分享微信小程序列表的下拉刷新和上划加载的实践。

效果图

首先来看看程序效果图,以下四张图从左至右依次是:下来刷新动画、下拉刷新结果、上划加载动画以及上划加载结果,程序中的数据均为模拟数据,不包含网络请求,所以可以直接运行。

微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析

方法一:用scroll-view组件实现

由于最后没有选择这种实现方法(下拉刷新有bug),因此只做简单介绍,当然如果没有下拉刷新的需求,scroll-view组件实现列表的渲染很方便,从官方文档可以看到,scroll-view组件集成了以下方法为编程提供很大便捷。

scroll-into-view String 值应为某子元素id,则滚动到该元素,元素顶部对齐滚动区域顶部
bindscrolltoupper EventHandle 滚动到顶部/左边,会触发 scrolltoupper 事件
bindscrolltolower EventHandle 滚动到底部/右边,会触发 scrolltolower 事件
bindscroll EventHandle 滚动时触发 event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY}

方法二:用page页面自带的功能

Page() 函数用来注册一个页面。接受一个 object 参数,其指定页面的初始数据、生命周期函数、事件处理函数等。

1、在app.json页设置窗口前景色为dark & 允许下拉

"window":{
  "backgroundTextStyle":"dark",
  "navigationBarBackgroundColor": "#000",
  "navigationBarTitleText": "wechat",
  "navigationBarTextStyle":"white",
  "enablePullDownRefresh": true
}

2、在list.json页设置允许下拉

{
  "enablePullDownRefresh": true
}

3、利用onPullDownRefresh监听用户下拉动作

注:在滚动 scroll-view 时会阻止页面回弹,所以在 scroll-view 中滚动无法触发onPullDownRefresh,因此在使用 scroll-view 组件时无法利用page的该特性。

onPullDownRefresh: function() {
 wx.showNavigationBarLoading() //在标题栏中显示加载
 let newwords = [{message: '从天而降',viewid:'-1',time:util.formatTime(new Date),greeting:'hello'}].concat(this.data.words);
 setTimeout( ()=> {
   this.setData({
     words: newwords
   })
   wx.hideNavigationBarLoading() //完成停止加载
   wx.stopPullDownRefresh() //停止下拉刷新
  }, 2000)
}

4、利用onReachBottom页面上拉触底事件

注:,首次进入页面,如果页面不满一屏时会触发 onReachBottom ,应为只有用户主动上拉才触发;手指上拉,会触发多次 onReachBottom,应为一次上拉,只触发一次;所以在编程时需要将这两点考虑在内。

onReachBottom:function(){
  console.log('hi')
  if (this.data.loading) return;
  this.setData({ loading: true });
  updateRefreshIcon.call(this);
  var words = this.data.words.concat([{message: '土生土长',viewid:'0',time:util.formatTime(new Date),greeting:'hello'}]);
  setTimeout( () =>{
    this.setData({
     loading: false,
     words: words
    })
  }, 2000)
 }
})

5、上划加载图标动画

/**
 * 旋转刷新图标
 */
function updateRefreshIcon() {
 var deg = 0;
 console.log('旋转开始了.....')
 var animation = wx.createAnimation({
  duration: 1000
 });
 var timer = setInterval( ()=> {
  if (!this.data.loading)
   clearInterval(timer);
  animation.rotateZ(deg).step();//在Z轴旋转一个deg角度
  deg += 360;
  this.setData({
   refreshAnimation: animation.export()
  })
 }, 2000);
}

最后附上布局代码:

<view wx:for="{{words}}" class="item-container">
  <view class="items">
    <view class="left">
       <view class="msg">{{item.message}}</view>
       <view class="time">{{item.time}}</view>
    </view>
    <view class="right">{{item.greeting}}</view>
  </view>
</view>
<view class="refresh-block" wx:if="{{loading}}">
 <image animation="{{refreshAnimation}}" src="../../resources/refresh.png"></image>
</view>

希望本文所述对大家微信小程序设计有所帮助。

Javascript 相关文章推荐
jquery 使用点滴函数代码
May 20 Javascript
Javascript继承机制的设计思想分享
Aug 28 Javascript
jQuery动画特效实例教程
Aug 29 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
Sep 01 Javascript
简单介绍JavaScript数据类型之隐式类型转换
Dec 28 Javascript
easyui validatebox验证
Apr 29 Javascript
angular分页指令操作
Jan 09 Javascript
原生js实现中奖信息无间隙滚动效果
Jan 18 Javascript
对vue.js中this.$emit的深入理解
Feb 23 Javascript
vue.js打包之后可能会遇到的坑!
Jun 03 Javascript
js如何实现元素曝光上报
Aug 07 Javascript
记一次react前端项目打包优化的方法
Mar 30 Javascript
vue2.0使用swiper组件实现轮播效果
Nov 27 #Javascript
解读vue生成的文件目录结构及说明
Nov 27 #Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
Nov 27 #Javascript
基于vue2.0实现简单轮播图
Nov 27 #Javascript
Vue父子模版传值及组件传值的三种方法
Nov 27 #Javascript
VueJs 将接口用webpack代理到本地的方法
Nov 27 #Javascript
vue-awesome-swiper滑块插件使用方法详解
Nov 27 #Javascript
You might like
php下实现伪 url 的超简单方法[转]
2007/09/24 PHP
PHP array 的加法操作代码
2010/07/24 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
2014/01/31 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
2014/03/03 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
Javascript中for循环语句的几种写法总结对比
2017/01/23 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
python读取和保存图片5种方法对比
2018/09/12 Python
用Python实现数据的透视表的方法
2018/11/16 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
Django中template for如何使用方法
2021/01/31 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
商务主管岗位职责
2013/12/08 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
法律六进活动方案
2014/03/13 职场文书
如何写自我鉴定
2014/03/19 职场文书
2014年财务工作总结与计划
2014/12/08 职场文书
副总经理岗位职责
2015/02/02 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
春节慰问简报
2015/07/21 职场文书