经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » 微信小程序 » 查看文章
微信小程序scroll-view实现上拉加载数据重复的解决方法
来源:jb51  时间:2021/8/16 16:34:48  对本文有异议

微信小程序的 scroll-view 上拉加载更多的BUG(数据会多加载,甚至有重复数据)。

问题描述:上拉一次,会多次触发触底函数 onReachBottom();换成自定义加载更多函数, 例如 loadMore(), 问题依旧存在。

生产环境:调试基础库 目前最新版本1.9.94 依旧存在这个问题。

解决方法:加状态控制变量,限制 触底函数/加载更多函数 的触发条件。

页面上拉加载更多后,看下图,有重复数据

通用前端wxml代码 search.wxml

  1. <!--pages/shop/search.wxml-->
  2. <scroll-view scroll-y="true" style="height:{{windowHeight}}px;" bindscrolltolower="onReachBottom">
  3.  
  4. <!-- 产品列表 -->
  5. <view class="flex-wrp">
  6. <block wx:for="{{items}}">
  7. <view bindtap="onItemClick" class="item-box" data-iid="{{item.id}}">
  8. <image class="item-pic" src="{{item.thumb}}" mode="aspectFill"></image>
  9. <view class="item-info">
  10. <view class='item-name'>{{item.name}}</view>
  11. <view class='price-sold-box'>
  12. <text class='current-price'>¥{{item.current_price}}</text>
  13. <text class='item-sold'><text class='sold-title'>销量</text> {{item.sold_num}}</text>
  14. </view>
  15. </view>
  16. </view>
  17. </block>
  18. </view>
  19. <view wx:if="{{pageEnd==true}}" class='scrollEnd'>已显示所有数据...</view>
  20. </scroll-view>

先看测试用例1 search.js(未修复BUG)

  1. //pages/shop/public/search/search.js
  2. /* 有BUG的JS用例 */
  3.  
  4. const app = getApp();
  5. var page = 0;//分页标签
  6. Page({
  7. data: {
  8. pageEnd:false, //是否页面底部
  9. windowHeight: app.getWH(),//应用程序高度
  10. // 商品列表数组
  11. items:[],
  12. },
  13.  
  14. /************************* 系统及页面功能函数 **************************/
  15. //页面加载
  16. onLoad: function (options) {
  17. //第一次加载
  18. this.getServerItems(page);
  19. },
  20. // 触底函数(上拉加载更多)
  21. onReachBottom: function () {
  22. this.getServerItems(page);
  23. },
  24.  
  25. /************************* 网络请求 **************************/
  26. /**
  27. * 获取服务器商品列表
  28. * @param {string} page 分页 默认0
  29. */
  30. getServerItems: function (pg) {
  31. var tar = this;
  32. //设置默认值
  33. pg = pg ? pg : 0;
  34. wx.showLoading({//显示toast
  35. title: '加载中...',
  36. });
  37. //网络请求
  38. wx.request({
  39. url: "https://xxx.com/api/items/search",
  40. data: {page: pg},
  41. method: 'POST',
  42. header: { 'content-type': 'application/x-www-form-urlencoded' },
  43. success: function (res) {//网络请求成功
  44. if (res.data.status == 1) {//有新数据
  45. var tmpArr = res.data.data;
  46. arr = arr.concat(tmpArr);
  47. tar.setData({
  48. items: arr,
  49. });
  50. page++;
  51.  
  52. } else {//res.data.status == 0 没有新数据了
  53. tar.setData({
  54. pageEnd:true,//显示页底信息
  55. })
  56. }
  57.  
  58. },
  59. error: function (e) {//网络请求失败
  60. console.log(e);
  61. },
  62. complete: function(c){//网络请求完成
  63. wx.hideLoading();//隐藏toast
  64. }
  65. })
  66.  
  67. },

修复BUG,在上面 search.js 基础上加上 触底函数控制变量 canUseReachBottom 后的 search.js

  1. //pages/shop/public/search/search.js
  2. /* 修复BUG后的JS用例 */
  3.  
  4. const app = getApp();
  5. var page = 0;
  6. /* ------------------------- */
  7. var canUseReachBottom = true;//触底函数控制变量
  8. /* ------------------------- */
  9. Page({
  10. data: {
  11. pageEnd:false,
  12. windowHeight: app.getWH(),
  13. items:[],
  14. },
  15. onLoad: function (options) {
  16. this.getServerItems(page);
  17. },
  18. // 触底函数(上拉加载更多)
  19. onReachBottom: function () {
  20. /* ------------------------- */
  21. if(!canUseReachBottom) return;//如果触底函数不可用,则不调用网络请求数据
  22. /* ------------------------- */
  23. this.getServerItems(page);
  24. },
  25. ServerItems: function (pg) {
  26. /* ------------------------- */
  27. canUseReachBottom = false;//触底函数关闭
  28. /* ------------------------- */
  29. var tar = this;
  30. pg = pg ? pg : 0;
  31. wx.showLoading({
  32. title: '加载中...',
  33. });
  34. wx.request({
  35. url: "https://xxx.com/api/items/search",
  36. data: {page: pg},
  37. method: 'POST',
  38. header: { 'content-type': 'application/x-www-form-urlencoded' },
  39. success: function (res) {
  40. if (res.data.status == 1) {//有新数据
  41. var tmpArr = res.data.data;
  42. arr = arr.concat(tmpArr);
  43. tar.setData({
  44. items: arr,
  45. });
  46. page++;
  47. /* ------------------------- */
  48. canUseReachBottom = true;//有新数据,触底函数开启,为下次触底调用做准备
  49. /* ------------------------- */
  50. } else {
  51. tar.setData({
  52. pageEnd:true,
  53. })
  54. }
  55.  
  56. },
  57. error: function (e) {
  58. console.log(e);
  59. },
  60. complete: function(c){
  61. wx.hideLoading();
  62. }
  63. })
  64.  
  65. },

总结:导致BUG的原因可能是因为 触底函数触发后,请求网络数据->小程序渲染数据到前端,因为这两个过程会比较耗时,所以前端还没来得及渲染完成,触底函数判断前端页面还是在底部,再一次或者多次触发 触底函数。从而导致数据多次重复加载

通过看手机端小程序开发版的vConsole也可以看到。上拉一次,连续触发了3次网络请求request begin,然后服务器才延时逐一返回success结果。如图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号