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


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 相关文章推荐
Gird事件机制初级读本
Mar 10 Javascript
基于Jquery的将DropDownlist的选中值赋给label的实现代码
May 06 Javascript
jquery插件制作教程 txtHover
Aug 17 Javascript
js数组的操作详解
Mar 27 Javascript
eclipse导入jquery包后报错的解决方法
Feb 17 Javascript
深入理解javascript原型链和继承
Sep 23 Javascript
DOM节点深度克隆函数cloneNode()用法实例
Jan 12 Javascript
基于javascript实现的快速排序
Dec 02 Javascript
一个例子轻松学会Vue.js
Jan 02 Javascript
jquery Ajax 全局调用封装实例详解
Jan 16 Javascript
vue实现带复选框的树形菜单
May 27 Javascript
小程序实现横向滑动日历效果
Oct 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
Zend的AutoLoad机制介绍
2012/09/27 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
VBScript版代码高亮
2006/06/26 Javascript
WordPress 照片lightbox效果的运用几点
2009/06/22 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
[05:08]顺网杯ISS-DOTA2赛歌 少女偶像Lunar青春演绎
2013/12/05 DOTA
python实现根据ip地址反向查找主机名称的方法
2015/04/29 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
python爬取哈尔滨天气信息
2018/07/14 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
农村婚礼证婚词
2014/01/10 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python