业务需求:

业务需求是给订单列表添加分页功能,也就是上拉加载这种每次只请求加载固定数量的数据。

需求分析:

对业务来说就是简单的分页上拉加载,但是对于技术实现来说,除了要处理分页数据的累加加载,还要处理操作订单返回列表后需要更新列表数据以同步订单最新状态,其中的难点在于后者。

当然你可以直接重新初始化列表数据(请求加载第一页),但是小程序中会记忆数据重载之前的滚动位置,所以要进行处理使页面滚动到顶部。但是如果订单列表数据比较多,用户操作的订单在第一页之后,那么操作订单后返回列表查找之前操作的订单就比较麻烦了,所以如果要求比较高的话,就不能这么操作了。

比较好的体验就是用户操作任何一个订单,如果订单状态改变那么更新列表数据并且返回列表后仍保持在之前操作订单的位置(只有该订单状态改变了,其他都不变)。

实现列表更新订单位置不变的关键代码:

  /**
* 将列表数据中指定位置的元素替换为操作订单所在的那一页的数据
*/
getNewList: function(orderList, curPageList, editPageNum) {
if (!orderList || !curPageList || !editPageNum) return;
orderList.splice((editPageNum - 1) * this.data.pageSize, this.data.pageSize, ...curPageList)
return orderList
}

注意:

  1. 加粗部分为关键代码,其中数组元素替换的索引开始及替换个数根据当前页码及每页显示个数来定义(这里pageNum从1开始);
  2. ...curPageList 为es6的扩展运算符,这里的作用是将curPageList的每个元素赋给orderList指定位置的元素进行替换。

整体代码:

import http from '../../utils/api.js'//接口请求封装
import coupon from '../../utils/coupon.js'//领取、查看卡券封装
import util from '../../utils/util.js'//点击防重等公用方法封装
Page({
data: {
orderList: [], //我的卡券列表
emptyData: '',//接口数据为空标志
pageNum: 1, //页码数,默认从1开始
pageSize: 10, //每页显示条数,默认10条
ispro: false, //默认不在请求中
isnext: false, //默认有下一页
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function(options) {
this.getCouponList(1);
},
/**
* 1.获取订单列表
* type 1:初始化加载第一页 2:触底加载 参数为空:查看卡券及领取卡券后重新加载数据(页数不变,替换最后的数据)
* editPageNum 领取卡券的订单所属的页数
* 接口调用前根据type进行参数初始化设置
* 接口响应处理中处理是否有下一页标志及列表数据
*/
getCouponList: function(type, editPageNum) {
let self = this;
let {
pageSize,
pageNum,
orderList
} = self.data
//触底加载带参调用,页数+1,否则页数重置为1
if (type == 1) {
//页面初始化加载第一页
pageNum = 1;
orderList = []
} else if (type == 2) {
//触底加载
pageNum++;
} else {
//领取卡券订单状态改变后重载列表指定页数据
if (editPageNum) pageNum = editPageNum
}
let params = {
openid: wx.getStorageSync("openid"),
pageNum: pageNum,
pageSize: pageSize
}
self.setData({
ispro: true
})
http.orderList(params).then(data => {
let list = data.order_list //接口返回列表数据
if (list.length > 0) {
list.map(item => {
item.pageNum = pageNum
return item
})
if (type == 1) {
//初始化加载第一页
orderList = list
} else if (type == 2) {
//触底加载,追加数据到列表中
orderList = orderList.concat(list)
} else {
//查看、领取卡券后只替换数组中当前页的数据
orderList = self.getNewList(orderList, list, editPageNum)
}
let hasNextPage = (data.total / pageSize) > pageNum; //是否有下一页
//给订单项添加所属页数(给订单状态改变重载当前页数据用)
self.setData({
orderList: orderList,
isnext: hasNextPage,
ispro: false,
pageNum: pageNum
})
} else {
self.setData({
ispro: false,
emptyData: true
})
}
})
},
/**
* 2.查看订单
*/
viewOrder: function(options) {
var self = this
let {
receive_status,
order_no,
pagenum
} = options.currentTarget.dataset
if (!order_no || receive_status == 2) return;
if (util.preventDuplicateClicks(4)) return;
if (receive_status == 0) {
//3. 领取卡券
coupon.couponReceive(order_no, function() {
self.getCouponList('', pagenum);
})
} else if (receive_status == 1) {
//4. 查看卡券
coupon.couponView(order_no)
}
},
/**
* 将列表数据中指定位置的元素替换为操作订单所在的那一页的数据
*/
getNewList: function(orderList, curPageList, editPageNum) {
if (!orderList || !curPageList || !editPageNum) return;
orderList.splice((editPageNum - 1) * this.data.pageSize, this.data.pageSize, ...curPageList)
return orderList
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function() {
var self = this
if (!self.data.ispro && self.data.isnext) {
self.getCouponList(2)
}
}
})

如上,其中领取卡券会修改订单状态,所以重载列表数据放在领取卡券成功后的回调中处理,这样,用户完成领取操作返回订单页面就已经完成了数据的重载,基本上无感知的。

这里对获取订单列表的逻辑进行了全面封装,集成了页面初始化数据加载、上拉加载以及领取、查看卡券后列表数据的静默更新加载。虽然整合起来有点耗脑细胞,不过还好,完美的解决了。

注意事项:

这种方法是基于订单总条数不变的情况下才可以使用的,一般情况下用户下单和订单列表订单查看是不会同时操作的,也就不会出现查看订单列表的时候订单总条数会增加的情况。也只有多端登录同时操作才有可能发生,这样的话就需要对列表总条数进行判断,总条数发生改变的话就需要重新加载第一页数据并滚动到底部了。

微信小程序开发——列表分页上拉加载封装实现(订单列表为例,订单状态改变后刷新列表滚动位置不变)的更多相关文章

  1. 【微信小程序】scroll-view 的上拉加载和下拉刷新

    1.在微信小程序中,想到 下拉刷新 和 上拉加载,如果是整个页面都拖动的话,可以在页面配置中,配置 enablePullDownRefresh 和 onReachBottomDistance 然后在 ...

  2. wepy小程序实现列表分页上拉加载(1)

    使用wepy开发微信小程序商城第一篇:项目初始化 使用wepy开发微信小程序商城第二篇:路由配置和页面结构 列表页效果图: 1.新建列表页 (1)在pages里面新建一个list.wpy文件 初始代码 ...

  3. wepy小程序实现列表分页上拉加载(2)

    第一篇:wepy小程序实现列表分页上拉加载(1) 本文接着上一篇内容: 4.优化-添加加载动画 (1)首先写加载动画的结构和样式 打开list.wpy文件 template结构代码: <temp ...

  4. [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息

    因为需要在小程序加个定位并加载对应城市信息 然而小程序自带api目前只能获取经纬度不能逆解析,虽然自己解析方式,但是同时也要调用地图,难道用户每次进小程序还要强行打开地图选择地址才定位吗?多麻烦也不利 ...

  5. 移动端web页面列表类上拉加载,查看详情,iframe嵌套第三方页面遇到的问题以及解决办法

    1.移动端上拉加载 网上有很多成熟的插件,比如iscroll.在这里介绍一下用jquery和js写的上拉加载方法.使用原生的去写上拉加载更多需要三个高度去做对比,以新闻类列表举例,首先需要整个dom的 ...

  6. 移动端h5列表页上拉加载更多

    背景 上星期公司要求做一个回收书籍的h5给安卓用,里面有一个功能是回收记录列表.设计师那边出的稿子是没有要求分页或者是上拉刷新的,但是众所周知,列表页数据很多的情况下,h5加载是很慢的.所以我一开始是 ...

  7. mui实现分页上拉加载更多 下拉刷新数据的简单实现 移动端下拉上拉

    空下来把mui上拉加载更多,下拉刷新数据做了一个简单的实现,希望可以帮助到需要的朋友 demo项目的结构 <!DOCTYPE html> <html> <head> ...

  8. 微信小程序小结(4) -- 分包加载及小程序间跳转

    分包加载 某些情况下,开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载(主要是空间不够用,哈哈~). 在构建小程序分包项目时,构建会输出一个或多个功能的分包,其中 ...

  9. Flutter 流式布局列表实例+上拉加载

    页面变化的几种方式: 一.StatefulWidget的setState形式 先声明两个变量. ; List<Map> list = []; 写了一个方法,获取数据: void _getH ...

随机推荐

  1. sqlserver - FOR XML PATH

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  2. window.open()被浏览器拦截问题汇总

    一.问题描述 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截.何况当出现拦截时,很多用户根本不知道发 ...

  3. https如何工作

    一.http 网络协议基于分层架构构建了七层模型,是ISO建立的用于计算机或者通信系统之间的互联的标准体系.下图展示了其中的五层: http被称为超文本传输协议,是互联网上应用最为广泛的一种网络协议, ...

  4. mysql Backup &recovery

    备份数据库非常重要,这样您就可以恢复数据,并在发生问题时重新启动并运行,例如系统崩溃,硬件故障或用户错误地删除数据. 在升级MySQL安装之前,备份也是必不可少的保护措施,它们可用于将MySQL安装转 ...

  5. Bazaar 版本控制工具

    Bazaar是一个分布式的版本控制系统,它发布在GPL许可协议之下,并可用于Windows.GNU/Linux.UNIX以及Mac OS系统.Bazaar由Canonical公司赞助,目前已服务于Sa ...

  6. python 之 os._exit() sys.exit() 、exit()

    sys.exit 执行该语句会直接退出程序,这也是经常使用的方法,也不需要考虑平台等因素的影响,一般是退出Python程序的首选方法. 退出程序引发SystemExit异常,(这是唯一一个不会被认为是 ...

  7. 全面理解Java内存模型(JMM)及volatile关键字(转)

    原文地址:全面理解Java内存模型(JMM)及volatile关键字 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型( ...

  8. linux下nginx的安装及配置

    一.安装nginx前,我们首先要确保系统安装了g++.gcc.openssl-devel.pcre-devel和zlib-devel软件,可通过如图所示命令进行检测,如果以安装我们可以通过图二所示卸载 ...

  9. odps编写UDF的实现

    问题 尝试写一个UDF,参数支持输入x,y与一个Polygon,返回结果是(x,y)是否在输入的Geometry之内? 环境 eclipse odps 插件 jts包:jts-1.8.jar 解法 i ...

  10. codeforces之始

    很早就听说acmer界的CF嘞!还记得刚开始听到神犇们在讨论CF的时候我还以为是网游CF(穿越火线)呢... 今年刚开学的时候就打算开始打cf的,由于一些事情耽搁了.之后又要准备省赛所以就一直拖到现在 ...