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


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 相关文章推荐
javascript 短路法代码精简
Aug 20 Javascript
jQuery 选择器理解
Mar 16 Javascript
js常用代码段整理
Nov 30 Javascript
通过遮罩层实现浮层DIV登录的js代码
Feb 07 Javascript
jQuery入门介绍之基础知识
Jan 13 Javascript
Vue实现一个返回顶部backToTop组件
Jul 25 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
Jan 25 Javascript
vue watch监听对象及对应值的变化详解
Feb 24 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
Nov 05 Javascript
利用Promise自定义一个GET请求的函数示例代码
Mar 20 Javascript
socket在egg中的使用实例代码详解
May 30 Javascript
最新最全的手机号验证正则表达式
Feb 24 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与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
微信支付开发订单查询实例
2016/07/12 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
js切换光标示例代码
2013/10/10 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
Bootstrap轮播插件简单使用方法介绍
2016/06/21 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
AngularJS实现动态添加Option的方法
2017/05/17 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
2019/08/16 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
Python全局变量用法实例分析
2016/07/19 Python
Python中列表list以及list与数组array的相互转换实现方法
2017/09/22 Python
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
微软台湾官方网站:Microsoft台湾
2018/08/15 全球购物
幼儿园六一儿童节活动方案
2014/08/26 职场文书
学校推普周活动总结
2015/05/07 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers