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


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 EasyUI API 中文文档 - TimeSpinner时间微调器
Oct 23 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
Feb 07 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
Apr 26 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
Jun 06 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
Dec 04 Javascript
点评js异步加载的4种方式
Dec 22 Javascript
JavaScript创建对象_动力节点Java学院整理
Jun 27 Javascript
Express + Session 实现登录验证功能
Sep 08 Javascript
ES6中Array.includes()函数的用法
Sep 20 Javascript
利用JS判断客户端类型你应该知道的四种方法
Dec 22 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
Dec 06 Javascript
JavaScript实现酷炫的鼠标拖尾特效
Feb 18 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中foreach循环中使用引用要注意的地方
2011/01/02 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
2016/05/23 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
angular内置provider之$compileProvider详解
2017/09/27 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
在Vue中使用this.$store或者是$route一直报错的解决
2019/11/08 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
Python中and和or如何使用
2020/05/28 Python
Python类class参数self原理解析
2020/11/19 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
视图的作用
2014/12/19 面试题
什么时候用assert
2015/05/08 面试题
企业出纳岗位职责
2014/03/12 职场文书
春游踏青活动方案
2014/08/14 职场文书
2014年统战工作总结
2014/12/09 职场文书
骆驼祥子读书笔记
2015/06/26 职场文书
运动会3000米加油稿
2015/07/21 职场文书