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


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 相关文章推荐
让网页根据不同IE版本显示不同的内容
Feb 08 Javascript
文本框根据输入内容自适应高度的代码
Oct 24 Javascript
JS删除数组元素的函数介绍
Mar 27 Javascript
jquery和javascript的区别(常用方法比较)
Jul 04 Javascript
JS求平均值的小例子
Nov 29 Javascript
百度地图API之本地搜索与范围搜索
Jul 30 Javascript
JavaScript数据结构与算法之集合(Set)
Jan 29 Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
JavaScript 预解析的4种实现方法解析
Sep 03 Javascript
Element Backtop回到顶部的具体使用
Jul 27 Javascript
JS实现放大镜效果
Sep 21 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数组键值用法实例分析
2015/02/27 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
PHP将页面中点击数量高的链接进行高亮显示的方法
2016/05/30 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
2017/03/04 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
jquery把int类型转换成字符串类型的方法
2016/10/07 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
2017/04/14 jQuery
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
python3.6 实现AES加密的示例(pyCryptodome)
2018/01/10 Python
对numpy中shape的深入理解
2018/06/15 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
会计毕业生求职简历的自我评价
2013/10/20 职场文书
口头翻译求职人自荐信
2013/12/07 职场文书
机电一体化应届生求职信范文
2014/01/24 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
班主任寄语2015
2015/02/26 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
python如何做代码性能分析
2021/04/26 Python
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang