最近给别个公司做技术支持,要实现微信小程序上拉刷新与下拉加载更多

微信给出的接口不怎么友好,最终想实现效果类似QQ手机版 ,一共3种下拉刷新状态变化,文字+图片+背景颜色

最终实现后的效果(这里提示有个不同点就是,自定义了导航条,并且下拉的时候,自定义导航条必须固定)

小程序实现下拉加载2种方式:

1. 简单粗暴,直接开启enablePullDownRefresh,开启全局下拉刷新

2.利用scroll-view组件

简单分析下2种方式的利与弊

enablePullDownRefresh方式

  • 优点:简单粗暴,兼容性没问题
  • 缺点1: 只能配置背景颜色,没有图片与状态提示的变化。
  • 缺点2: 最重要的一点,如果自定义了导航条即使采用fixed定位,整个导航条还是会随页面一起往下拉动,整个布局效果非常变扭。这才是我放弃的最终原因(参考最终效果图,自定义了导航条)

scroll-view方式

  • 优点:可以自定义(参考最终效果图)
  • 缺点:安卓与微信存在不同的兼容问题,所以针对2套平台要有2套处理方式,比较麻烦

实现原理:

enablePullDownRefresh的方式没啥好说的,按照文档的来。

scroll-view方式的就比较麻烦了,首先说下引起问题的2个因素点

  • 自定义了导航条
  • IOS上有橡皮筋效果,安卓没有

自定义了导航条,那么页面的布局一定要减去这个导航条的占位,所以scroll-view包裹的区域,一定会有一个定位处理,top的定位距离就是导航条的高度。

IOS上scroll-view的实现原理

IOS默认存在橡皮筋效果那么意味着就会有反弹反馈,元素滚动一定会有scrollTop的变化,那么利用scrollTop的变化就能很好的实现

为了滚动的性能最大优化,所以默认都是用系统自带滚动,并不会做控制页面内容本身的滑动

布局的时候,原来的滚动内容部分用scroll-view包装,并且在之前加上下拉刷新的展示区域view,利用translateY把scroll-view的top设置为负值(展示区域的高度),这样就把下拉的显示区域拼接到了scroll-view之前,并且还看不到

在下拉scroll-view的时候,由于ios支持橡皮筋效果,所以scrollTop为负值的时候,展示区域自动会随着scrollTop的递减而出现。

状态的与图片的变化,可以通过监听scroll事件,通过scrollTop值的变化,做出相应的改变。当然这里还会有scrolltolower与touchend事件,要知道什么时候松手后触发刷新,并且刷新之后还要设置还原

安卓上scroll-view的实现原理

安卓就这样,没有反弹效果,所以scrollTop也不会有负数。这时候只能靠手动移动页面模拟反弹了。

安卓上需要对scroll-view绑定 start,move,end,scroll,upper事件,要监听用户的页面操作,当然如果是正常滚动内容的时候,不影响,也不做任何处理,一旦用户是下拉刷新操作,才介入

页面的布局也是由下拉刷新的展示区域+包裹内容的scroll-view区域组成,不同于ios布局的就是,下拉刷新区域默认高度是0,scroll-view也不需要设置translateY负值了,需要下拉的时候调整展示区域的高度

通过lower事件判断是边界,如果下拉越界,那么通过move控制scroll-view区域整体的往下滑动同时控制下拉刷新区域的高度变化,这样就实现了下拉的效果

最后在end中,判断下移动的距离跟刷新的高度对比,从而更改下拉的状态与图片,并且触发刷新请求,最后可以动画复位

封装

一般这种功能直接做成组件就好了,ios与安卓可以独立2个组件,然后注册到一个中介的组件中,判断调用哪个,这样比较好维护。

组件内部可以分成3部分

view 下拉刷新区域
slot 内容的slot区域
view 上拉加载更多区域

不过注意一点,slot一定要加高度,加高度。因为ios默认是反弹,滚动的,如果没有内容,或者内容高度不足,没撑开全部,那么就会触发默认滚动,页面的导航条会上下移动

<view style="min-height:100%;">
<slot></slot>
</view>

  

结尾:

由于自定义了导航条,引起了一堆的问题出来,说不上好与坏,反正遇到问题总是要想办法解决的。

这里简单的记录下,给初入小程序的当个借鉴吧。可能我也有处理不对的,或者有更好的方法,可以给下建议。

代码部分如果有需要,等有空了,我就分离出来发一份咯。

微信小程序-自定义下拉刷新的更多相关文章

  1. 微信小程序的下拉刷新

    微信小程序的下拉刷新:在page的js文件中有监听用户下拉刷新的处理函数onPullDownRefresh:function(){} //js文件中自带的处理函数,在onUnload下面,注意不要重复 ...

  2. 微信小程序:下拉刷新

    下拉刷新 1.需要在json文件中,设置"enablePullDownRefresh": true,表示该页面使用下拉刷新 2.在微信内置函数onPullDownRefresh中进 ...

  3. 【微信小程序】下拉刷新真机测试无效

    根据文档的描述,做上拉加载时直接实现页面的onReachBottom()函数即可.但是要做下拉刷新时,除了实现onPullDownRefresh()函数外,还必须要在app.json中配置开启enab ...

  4. 微信小程序-解决下拉刷新报错

    关于“enablePullDownRefresh”: “true” 一.使用方式 在 Page 中定义 onPullDownRefresh 处理函数,监听该页面用户下拉刷新事件.需要在 config ...

  5. 微信小程序 - 关于下拉刷新

    // 拉取数据 fetchData: function() { wx.request({ url: 'http://v.juhe.cn/toutiao/index', data: { type: '' ...

  6. 微信小程序组件 下拉刷新

    <!-- &&底部加载 --> <view class='page-add-data flexca'> <text>{{pageTottomText ...

  7. 微信小程序实现下拉刷新上拉加载

    代码片段:https://developers.weixin.qq.com/s/K9VbWZmy7e8C

  8. 微信小程序禁止下拉_解决小程序下拉出现空白的情况

    微信小程序禁止下拉 在微信小程序中,用力往下拉动,页面顶部会出现一段空白的地方. 产品的需求不太允许这么做,会影响用户体验,查看文档发现可以使用enablePullDownRefresh这属性来实现, ...

  9. 微信小程序-页面下拉

    微信小程序当滑动到最顶部和最底部时,继续下拉,会将整个页面拉下去或者拉上去,本来以为是客户端自有的特性,就没去管他,直到我的禅道出现了这个记录... 其实这个问题是可以解决的,只需要在你不想出现在此情 ...

随机推荐

  1. jvm排查问题常用命令及注释

    本文将介绍JDK自带的JVM排查工具.其提供的排查工具有: (1)jps:JVM Process Status Tool,显示系统内所有的JVM进程: (2)jstat:JVM Statistics ...

  2. Android面试准备20190422

    1.即时推送原理,采用的push推送模式,保持一个长连接,服务端和客户端连接后不再断开.所谓长连接,即是在一个TCP上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发送检测 ...

  3. Python播放、关闭音乐代码

    1.安装pygame:win + r :打开控制台输入:pip install pygame 2.#导入 import time import pygame 3.设置音乐绝对路径 #音乐路径 file ...

  4. 转载:如何优雅的实现INotifyPropertyChanged接口

    转载来源:http://www.cnblogs.com/TianFang/p/6240933.html 如何优雅的实现INotifyPropertyChanged接口 INotifyPropertyC ...

  5. VC++安装及使用

    1.在浏览器上下载后不能安装 2.黄振古QQ发原文件,依然不能安装 3.考虑后,想通过360压缩安装 4.浏览器上下载的360压缩大多有病毒,无奈下,删掉鲁大师,下载360安全卫士,通过360下载36 ...

  6. python requests库网页爬取小实例:亚马逊商品页面的爬取

    由于直接通过requests.get()方法去爬取网页,它的头部信息的user-agent显示的是python-requests/2.21.0,所以亚马逊网站可能会拒绝访问.所以我们要更改访问的头部信 ...

  7. optional的使用

    :first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...

  8. Python 中 Iterator和Iterable的区别

    Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器.为什么? 因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的 ...

  9. CSS网页布局

    注:优化样式表:增加css样式表的可读性 减伤样式重复 一.主要内容 1.布局分类;131   121 2.display属性排版 3.float属性排版(横向多列布局) 4.防止父类盒子塌陷 二.标 ...

  10. python 数据库mysql、redis及发送邮件

    python 关系型数据库链接使用--mysql import pymysql # 引用mysql模块 # 创建连接,指定数据库的ip地址,账号.密码.端口号.要操作的数据库.字符集coon = py ...