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


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 查找iframe父级页面元素的实现代码
Aug 28 Javascript
Javascript 浮点运算的问题分析与解决方法
Aug 27 Javascript
Javascript中对象继承的实现小例
May 12 Javascript
全面解析Bootstrap弹窗的实现方法
Dec 01 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
Oct 13 Javascript
BootStrap中
Dec 10 Javascript
node.JS md5加密中文与php结果不一致的解决方法
May 05 Javascript
js分页之前端代码实现和请求处理
Aug 04 Javascript
vue项目中引入noVNC远程桌面的方法
Mar 05 Javascript
QML实现圆环颜色选择器
Sep 25 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
Dec 16 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
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
推荐5款跨平台的PHP编辑器
2014/12/25 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
ECMAScript 基础知识
2007/06/29 Javascript
jquery1.4后 jqDrag 拖动 不可用
2010/02/06 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
浅析JavaScript中的类型和对象
2013/11/29 Javascript
js对象内部访问this修饰的成员函数示例
2014/04/27 Javascript
Web表单提交之disabled问题js解决方法
2015/01/13 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
JavaScript中String.prototype用法实例
2015/05/20 Javascript
谈谈JavaScript自定义回调函数
2015/10/18 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
浅析js的模块化编写 require.js
2016/12/07 Javascript
Vue2.0 多 Tab切换组件的封装实例
2017/07/28 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
layui复选框限制选择个数的方法
2019/09/18 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
tensorflow之tf.record实现存浮点数数组
2020/02/17 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
老海军美国官网:Old Navy
2016/09/05 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
小学生打架检讨书
2014/01/26 职场文书
开服装店计划书
2014/08/15 职场文书
大学生毕业个人总结
2015/02/15 职场文书
大学感恩节活动总结
2015/05/05 职场文书
教师考核鉴定意见
2015/06/05 职场文书