微信小程序之上拉加载与下拉刷新

在移动端,随着手指不断向上滑动,当内容将要到达屏幕底部的时候,页面会随之不断的加载后续内容,直到没有新内容为止(我们是有底线的-o-),我们称之为上拉加载,从技术角度来说,也可以称之为触底加载

这种方式其实是PC端分页浏览的一个分页形式变种,很多PC网页也会采用这种方式来进行内容分页加载,以替代比较古老的1,2,3,4,5,6,7...分页(称之为有页码的分页,这种分页方式其实在一些场景下仍然是非常有用的,特别是在后台管理系统页面中需要精确抵达某一数据页的场景)。

另一种在移动端常见的操作,就是像在刷微博或微信朋友圈的时候,我想看看有没有新的内容出现,就会在页面到顶的时候,将页面从上往下拖拉(这个时候页顶通常会出现一个转动的菊花之类的),然后放开手指,伴随着一声清脆的叮铃咚隆声,页面上呈现出了你朋友新鲜出炉的自拍照或鸡汤文。

这种向下拖拉刷新的交互方式(简称下拉刷新),在移动端可以说是一种非常自然且方便的操作,在现在的移动应用中被广泛采用。

好了,上面简要介绍了一下我们今天要关注的两个交互方式,目的当然是要在微信小程序中来实现它们。其实,微信小程序提供的技术框架已经为我们做了很多事情,让这两种交互实现起来变得相对很容易了。

下面我们就来一一讲解具体的代码实现。

上拉加载

前面我们已经了解到下拉加载的本质是一个分页加载,每次触发加载下一页的条件是当前页面到达底部,因此,我们可以整理出一个实现的基本思路:

初始页号为1,向后端请求第一页数据(数据中包含数据总条数,及当前页的数据数组),返回后渲染该该页数据

监听页面是否被滚动到底部,是的话,则递增页号(+1)并向后端请求该新页号的数据,返回结果后,将该页数据添加到之前已加载的数据后面,并重新渲染

重复步骤2的操作

这个流程是不是很好理解?感觉实现起来也不难,主要就是其中的“监听页面是否被滚动到底部”如何来实现?在Web页面开发中,我们会通过监听window.onscroll事件,在该事件的处理方法中获取当前页的高度和滚动量,以此来计算判断页面是否已滚动到底。而在微信小程序中,我们并不需要自己来计算,小程序的Page已提供现成的监听用户上拉触底事件的处理函数:onReachBottom,它会在页面触底的时候自动触发(或在距离页底一定距离的时候触发,可设置)。

那么按照上面的原理,实现出来的小程序代码将会是什么样子?假设我们的例子是一个加载文章列表的页面,下面是article.js代码:

import{getArticles}from'../../services/article.service'Page({data:{page:1,pages:0,articles:[]},onLoad(options){// 页面初次加载,请求第一页数据this.fetchArticleList(1)},onReachBottom(){// 下拉触底,先判断是否有请求正在进行中// 以及检查当前请求页数是不是小于数据总页数,如符合条件,则发送请求if(!this.loading&&this.data.page<this.data.pages){this.fetchArticleList(this.data.page+1)}},fetchArticleList(pageNo){this.loading=true// 向后端请求指定页码的数据returngetArticles(pageNo).then(res=>{constarticles=res.itemsthis.setData({page:pageNo,//当前的页号pages:res.pages,//总页数articles:this.data.articles.concat(articles)})}).catch(err=>{console.log("==> [ERROR]",err)}).then(()=>{this.loading=false})}})

从示例代码中看到,我们发送和处理返回数据的函数主要就是fetchArticleList了,它分别在页面初始化onLoad时被调用一次,以及每次在上拉触底触发onReachBottom时被调用。

下拉刷新

再来说下拉刷新,在小程序里面实现起来可能比起上拉加载更简单一些呢。只要在小程序的全局配置文件app.json的window部分或在每个Page的同名配置文件里,加入一个值为true的enablePullDownRefresh配置项,并在需要处理下拉事件的Page代码中加入onPullDownRefresh函数,就能开始接收下拉事件并进行你自己的处理逻辑了,当处理完成后,记得一定要调用wx.stopPullDownRefresh来终止下拉刷新。

我们仍然来根据上面的文章列表的例子,来实现下拉刷新:

首先是配置article.json:

{"enablePullDownRefresh":true}

然后在article.js中进行如下改写:

import{getArticles}from'../../services/article.service'Page({data:{page:1,pages:0,articles:[]},onLoad(options){// 页面初次加载,请求第一页数据this.fetchArticleList(1,true)},onReachBottom(){// 下拉触底,先判断是否有请求正在进行中// 以及检查当前请求页数是不是小于数据总页数,如符合条件,则发送请求if(!this.loading&&this.data.page<this.data.pages){this.fetchArticleList(this.data.page+1)}},onPullDownRefresh(){// 上拉刷新if(!this.loading){this.fetchArticleList(1,true).then(()=>{// 处理完成后,终止下拉刷新wx.stopPullDownRefresh()})}},fetchArticleList(pageNo,override){this.loading=true// 向后端请求指定页码的数据returngetArticles(pageNo).then(res=>{constarticles=res.itemsthis.setData({page:pageNo,//当前的页号pages:res.pages,//总页数articles:override?article:this.data.articles.concat(articles)})}).catch(err=>{console.log("==> [ERROR]",err)}).then(()=>{this.loading=false})}})

可以看到,我们增加了一个onPullDownRefresh函数并在里面调用了fetchArticleList去请求第一页的数据,并且fetchArticleList函数也稍稍做了一下改动,加了一个参数override,用于重置articles数据,而不是像上拉加载时那样一直在原有数据后面进行添加。

另外,下拉刷新的事件也可以通过调用APIwx.startPullDownRefresh触发,效果与用户手动下拉刷新一致。

其他

上面介绍的上拉加载和下拉刷新,都是针对整个Page的。如果你需要局部的相应功能,你可以尝试使用<scroll-view>做容器,并通过它的bindscrolltoupper和bindscrolltolower来监听内容到顶或到底的事件,模拟实现出上拉加载和下拉刷新功能。

作者:一斤代码

链接:https://www.jianshu.com/p/d89e79d09e64

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容