支付宝小程序 UI·上滑加载更多

2020-09-07 17:37 更新

小程序列表数量较多时,可以通过分页上拉加载,增加页面首屏渲染速度。

扫码体验

上拉加载.png

前提条件

使用列表上拉加载的前提条件如下:

获取模板代码

下载 上拉加载 Demo.zip 文件,并解压至本地, 使用 IDE 打开。

示例代码

index.json

  1. {
  2. "defaultTitle": "上拉加载"
  3. }

index.axml

  1. <view class="schedule-container">
  2. <scroll-view scroll-y="{{true}}" onScrollToLower="scrollMytrip" class="schedule-scroll">
  3. <view a:for="{{list}}" class="schedule-detail">
  4. <view class="schedule-place">{{item.title}}</view>
  5. <view class="schedule-trainNumber padd font">{{item.remarksa}}</view>
  6. <view class="schedule-time padd font">{{item.remarksb}}</view>
  7. </view>
  8. <view class="spinner" style="{{show ? '' : 'display:none'}}">
  9. <view class="bounce1 bounce"></view>
  10. <view class="bounce2 bounce"></view>
  11. <view class="bounce3 bounce"></view>
  12. <view style="margin:20rpx 0 0 20rpx;color:#666666;">加载中...</view>
  13. </view>
  14. </scroll-view>
  15. </view>

index.acss

  1. .schedule-container{
  2. width: 100vw;
  3. height: 100vh;
  4. overflow: hidden;
  5. }
  6. .schedule-scroll {
  7. width: 100%;
  8. height: 100%;
  9. position: absolute;
  10. top: 0px;
  11. }
  12. .spinner {
  13. text-align: center;
  14. height: 60rpx;
  15. line-height: 60rpx;
  16. display: flex;
  17. justify-content: center;
  18. align-items: center;
  19. }
  20. .spinner .bounce {
  21. margin-top: 20rpx;
  22. width: 13rpx;
  23. height: 21rpx;
  24. display: inline-block;
  25. animation-fill-mode: both;
  26. margin-left: 13rpx;
  27. transform: skewX(-15deg);
  28. }
  29. .spinner .bounce1 {
  30. background: #108EE9;
  31. animation: bouncedelay1 2.1s infinite linear;
  32. }
  33. .spinner .bounce2 {
  34. background: #9DCDEF;
  35. animation: bouncedelay2 2.1s infinite linear;
  36. }
  37. .spinner .bounce3 {
  38. background: #EAECF3;
  39. animation: bouncedelay3 2.1s infinite linear;
  40. }
  41. .spinner .spinner-word {
  42. margin-top: 24rpx;
  43. line-height: 40rpx;
  44. height: 40rpx;
  45. font-family: PingFangSC-Regular;
  46. font-size: 28rpx;
  47. color: #999999;
  48. }
  49. @keyframes bouncedelay1 {
  50. 0% {
  51. background: #108EE9;
  52. }
  53. 50% {
  54. background: #9DCDEF;
  55. }
  56. 100% {
  57. background: #EAECF3;
  58. }
  59. }
  60. @keyframes bouncedelay2 {
  61. 0% {
  62. background: #9DCDEF;
  63. }
  64. 50% {
  65. background: #EAECF3;
  66. }
  67. 100% {
  68. background: #108EE9;
  69. }
  70. }
  71. @keyframes bouncedelay3 {
  72. 0% {
  73. background: #EAECF3;
  74. }
  75. 50% {
  76. background: #108EE9;
  77. }
  78. 100% {
  79. background: #9DCDEF;
  80. }
  81. }
  82. .schedule-detail {
  83. width: 100%;
  84. height: 218rpx;
  85. background-color: #ffffff;
  86. margin-top: 20rpx;
  87. }
  88. .schedule-place , .schedule-trainNumber ,.schedule-time {
  89. padding: 30rpx 30rpx 35rpx 30rpx;
  90. display: flex;
  91. flex-direction: row;
  92. justify-content: space-between;
  93. font-size:32rpx;
  94. color: #333333;
  95. }
  96. .schedule-money {
  97. color:#E8541E;
  98. }
  99. .font {
  100. color:#999999;
  101. font-size: 28rpx;
  102. }
  103. .padd {
  104. padding: 0rpx 30rpx 20rpx 30rpx;;
  105. }

index.js

  1. // mock列表数据
  2. const mockData = [{
  3. title: '列表1',
  4. remarksa: '备注1',
  5. remarksb: '备注2'
  6. }, {
  7. title: '列表2',
  8. remarksa: '备注1',
  9. remarksb: '备注2'
  10. }, {
  11. title: '列表3',
  12. remarksa: '备注1',
  13. remarksb: '备注2'
  14. }, {
  15. title: '列表4',
  16. remarksa: '备注1',
  17. remarksb: '备注2'
  18. }, {
  19. title: '列表5',
  20. remarksa: '备注1',
  21. remarksb: '备注2'
  22. }, {
  23. title: '列表6',
  24. remarksa: '备注1',
  25. remarksb: '备注2'
  26. }];
  27. // mock列表总数
  28. const mockTotal = 60;
  29. Page({
  30. data: {
  31. show: false, // 是否显示加载动画
  32. page: 1, // 当前页数
  33. list: [] // 页面List数据
  34. },
  35. onLoad() {
  36. // 页面加载默认数据
  37. this.mySchedulde();
  38. },
  39. /**
  40. * scroll-view滑到底部触发事件
  41. * @method scrollMytrip
  42. */
  43. async scrollMytrip() {
  44. try {
  45. const { page, list, } = this.data;
  46. // 判断是否还有数据需要加载
  47. if (list.length < mockTotal) {
  48. this.setData({ show: true });
  49. const newPage = page + 1;
  50. this.mySchedulde(newPage);
  51. }
  52. } catch (e) {
  53. this.setData({ show: false });
  54. console.log('scrollMytrip执行异常:', e);
  55. }
  56. },
  57. /**
  58. * 模拟请求服务端查询数据并渲染页面
  59. * @method mySchedulde
  60. * @param {int} page 分页,默认第1
  61. */
  62. async mySchedulde(page = 1) {
  63. try {
  64. let list = this.data.list;
  65. // 模拟请求拿到数据进行更新data
  66. setTimeout(() => {
  67. let data = mockData;
  68. for (let i = 0; i < data.length; i++) {
  69. let newObj = { ...data[i], remarksa: `我是第${page}页` };
  70. list.push(newObj);
  71. }
  72. this.setData({
  73. list,
  74. page,
  75. show: false
  76. });
  77. }, 800);
  78. } catch (e) {
  79. console.log('mySchedulde执行异常:', e);
  80. }
  81. }
  82. });
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号