微信扫码登录

其他登录方式

绑定手机号

注册

我同意用户协议

忘记密码

用户协议

绑定手机号

近期有不法分子打着爱盈利的旗号,制作“爱盈利”名称的App,并伪造爱盈利证件,骗取用户信任,以抖音点赞赚钱或其他方式赚钱为名义,过程中以升级会员获得高佣金为名让用户充值。
爱盈利公司郑重声明:我司没有研发或运营过任何名为“爱盈利”的APP,我司做任务赚钱类产品从没有让任何普通用户充值升级会员。我公司产品均在本网站可查询,请将网站拉至底部,点击“关于我们”可查看爱盈利相关产品与服务。
温馨提示:当遇到此类问题请拨打官方电话或添加官方微信,以免财产损失。爱盈利官网地址:www.aiyingli.com。
  • 推广与合作
X

小程序丨教你:微信小程序中如何实现分页下拉加载?(附源码)

来源:网络 4344

教你小程序系列教程:
1.教你:微信小程序如何实现scroll-view隐藏滚动条
2.教你:如何使用scroll-view组件实现视图垂直滚动(附源码)
3.教你:小程序如何使用swiper组件实现图片切换(附源码)
4.教你:微信小程序中如何设置拨打电话(附源码)
5.教你:如何打开小程序如何打开微信自带的地图(附源码) 

6. 教你:如何使用小程序画布组件绘制自动缩放正方形(附源码)
7. 教你:如何使用微信小程序video组件播放视频(附源码)
8. 教你:如何使用小程序画布组件绘制一个会自动旋转正方形(附源码)

9.教你:微信小程序中如何实现分页下拉加载?(附源码)



转眼间我们教你微信

小程序

系列已经有十节系列课程了,每天的工作压力繁重,小女子也不知道自己还能坚持这样的系列教程多久。只希望每篇教程真的对大家有帮助。这节课我们要介绍的就是如何实现分页的下拉加载,我们先来看效果图


教你:微信小程序中如何实现分页下拉加载?(附源码)

<view class="copyright">

    <view class="copyright_item">CopyRight:All Right Reserved</view>

    <view class="copyright_item">原创作者:51小程序</view>

    <view class="copyright_item">微信

小程序开发

者社区</view>

    <view class="copyright_item"></view>

    <view class="copyright_item"><image class="img" src="../copyright/image/logo.png"/></view>

    <view class="goto_counter"><button type="default" bindtap="goto_counter">点击进入下拉加载演示页面</button></view>

</view>

    

当用户打开一个页面时,假设后台数据量庞大时,一次性地返回所有数据给客户端,页面的打开速度就会有所下降,而且用户只看上面的内容而不需要看后面的内容时,也浪费用户流量,基于优化的角度来考虑,后台不要一次性返回所有数据,当用户有需要再往下翻的时候,再加载更加数据出来。


业务需求:

列表滚动到底部时,继续往上拉,加载更多内容


必备参数:

(1)pageindex: 1 //第几次加载

(2)callbackcount: 15 //需要返回数据的个数

其他参数:

根据接口的所需参数


实现原理:

当第一次访问接口时,传递2个必备参数(第1次加载,需要返回数据的个数为15个),和其他参数(需要搜索的字符串)给后台,后台返回第一次数据过来。在请求成功的的回调函数中,判断返回的数据是否>0,是,则取出数据,渲染视图层,并把“上拉加载”显示在列表底部;否,则没有数据可取,并把“没有更多”显示在列表底部,同时把“上拉加载”隐藏掉。

当用户已经滚动到列表底部(这里使用到小程序提供的scroll-view组件的bindscrolltolower事件),触发bindscrolltolower事件,参数pageindex+1,再把2个必备参数(第2次加载,需要返回数据的个数为15个)和其他参数(需要搜索的字符串)给后台,后台把其余的数据返回给前台,前台在原来数据的基础上添加数据


主要的页面结果如下:

1.index.wxml

<view class="search"> 

  <view class="search-bar"> 

    <view class="search-wrap"> 

        <icon type="search" size="16" class="icon-search" /> 

        <input type="text" placeholder="请输入搜索内容" class="search-input" name="searchKeyword" bindinput="bindKeywordInput" value="{{searchKeyword}}" /> 

    </view> 

    <view class="search-cancel" bindtap="keywordSearch">搜索</view> 

  </view> 

  <view class="search-result"> 

    <scroll-view scroll-y="true" bindscrolltolower="searchScrollLower"> 

      <view class="result-item" wx:for="{{searchSongList}}" wx:key="unique"  data-data="{{item}}" > 

        <view class="icon{{item.isonly=='0' ? ' nocopyright' : ''}}"></view> 

        <text class="title">{{item.songname}}</text> 

        <view class="subtitle"> 

          <text wx:for="{{item.singer}}" wx:key="unique">{{item.name}}</text> 

        </view> 

      </view> 

      <view class="loading" hidden="{{!searchLoading}}">正在载入更多...</view> 

      <view class="loading complete" hidden="{{!searchLoadingComplete}}">已加载全部</view> 

    </scroll-view>   

  </view> 

</view>

2.index.wxss



page{  


  display: flex;  


  flex-direction: column;  


  height: 100%;  


}  


  


/*搜索*/  


.search{  


  flex: auto;  


  display: flex;  


  flex-direction: column;  


  background: #fff;  


}  


.search-bar{  


  flex: none;  


  display: flex;  


  align-items: center;  


  justify-content: space-between;  


  padding: 20rpx;  


  background: #f4f4f4;  


}  


.search-wrap{  


  position: relative;  


  flex: auto;  


  display: flex;  


  align-items: center;  


  height: 80rpx;  


  padding: 0 20rpx;  


  background: #fff;  


  border-radius: 6rpx;  


}  


.search-wrap .icon-search{  


  margin-right: 10rpx;  


}  


.search-wrap .search-input{  


  flex: auto;  


  font-size: 28rpx;  


}  


.search-cancel{  


  padding: 0 20rpx;  


  font-size: 28rpx;  


}  


  


/*搜索结果*/  


.search-result{  


  flex: auto;  


  position: relative;  


}  


.search-result scroll-view{  


  position: absolute;  


  bottom: 0;  


  left: 0;  


  right: 0;  


  top: 0;  


}  


.result-item{  


  position: relative;  


  display: flex;  


  flex-direction: column;  


  padding: 20rpx 0 20rpx 110rpx;  


  overflow: hidden;  


  border-bottom: 2rpx solid #e5e5e5;  


}  


  


.result-item .media{  


  position: absolute;  


  left: 16rpx;  


  top: 16rpx;  


  width: 80rpx;  


  height: 80rpx;  


  border-radius: 999rpx;  


}  


.result-item .title,  


.result-item .subtitle{  


  overflow: hidden;  


  text-overflow: ellipsis;  


  white-space: nowrap;  


  line-height: 36rpx;  


}  


.result-item .title{  


  margin-bottom: 4rpx;  


  color: #000;  


}  


.result-item .subtitle{  


  color: #808080;  


  font-size: 24rpx;  


}  


.result-item:first-child .subtitle text{  


  margin-right: 20rpx;  


}  


.result-item:not(:first-child) .subtitle text:not(:first-child):before{  


  content: '/';  


  margin: 0 8rpx;  


}  


.loading{  


  padding: 10rpx;  


  text-align: center;  


}  


.loading:before{  


  display: inline-block;  


  margin-right: 5rpx;  


  vertical-align: middle;  


  content: '';  


  width: 40rpx;  


  height: 40rpx;  


  background: url(../index/images/icon-loading.png) no-repeat;  


  background-size: contain;  


  animation: rotate 1s linear infinite;  


}  


.loading.complete:before{  


  display: none;  


}  


3.index.js


var util = require('../../utils/util.js')  


Page({  


  data: {  


    searchKeyword: '',  //需要搜索的字符  


    searchSongList: [], //放置返回数据的数组  


    isFromSearch: true,   // 用于判断searchSongList数组是不是空数组,默认true,空的数组  


    searchPageNum: 1,   // 设置加载的第几次,默认是第一次  


    callbackcount: 15,      //返回数据的个数  


    searchLoading: false, //"上拉加载"的变量,默认false,隐藏  


    searchLoadingComplete: false  //“没有数据”的变量,默认false,隐藏  


  },  


  //输入框事件,每输入一个字符,就会触发一次  


  bindKeywordInput: function(e){  


    console.log("输入框事件")  


    this.setData({  


      searchKeyword: e.detail.value  


    })  


  },  


  //搜索,访问网络  


  fetchSearchList: function(){  


    let that = this;  


    let searchKeyword = that.data.searchKeyword,//输入框字符串作为参数  


        searchPageNum = that.data.searchPageNum,//把第几次加载次数作为参数  


        callbackcount =that.data.callbackcount; //返回数据的个数  


    //访问网络  


    util.getSearchMusic(searchKeyword, searchPageNum,callbackcount, function(data){  


      console.log(data)  


      //判断是否有数据,有则取数据  


      if(data.data.song.curnum != 0){  


        let searchList = [];  


        //如果isFromSearch是true从data中取出数据,否则先从原来的数据继续添加  


        that.data.isFromSearch ? searchList=data.data.song.list : searchList=that.data.searchSongList.concat(data.data.song.list)  


        that.setData({  


          searchSongList: searchList, //获取数据数组  


          zhida: data.data.zhida, //存放歌手属性的对象  


          searchLoading: true   //把"上拉加载"的变量设为false,显示  


        });  


      //没有数据了,把“没有数据”显示,把“上拉加载”隐藏  


      }else{  


        that.setData({  


          searchLoadingComplete: true, //把“没有数据”设为true,显示  


          searchLoading: false  //把"上拉加载"的变量设为false,隐藏  


        });  


      }  


    })  


  },  


  //点击搜索按钮,触发事件  


  keywordSearch: function(e){  


    this.setData({    


      searchPageNum: 1,   //第一次加载,设置1  


      searchSongList:[],  //放置返回数据的数组,设为空  


      isFromSearch: true,  //第一次加载,设置true  


      searchLoading: true,  //把"上拉加载"的变量设为true,显示  


      searchLoadingComplete:false //把“没有数据”设为false,隐藏  


    })  


    this.fetchSearchList();  


  },  


  //滚动到底部触发事件  


  searchScrollLower: function(){  


    let that = this;  


    if(that.data.searchLoading && !that.data.searchLoadingComplete){  


      that.setData({  


        searchPageNum: that.data.searchPageNum+1,  //每次触发上拉事件,把searchPageNum+1  


        isFromSearch: false  //触发到上拉事件,把isFromSearch设为为false  


      });  


      that.fetchSearchList();  


    }  


  }  


})  


完整版的代码如下:

爱盈利(aiyingli.com)移动互联网最具影响力的盈利指导网站。定位于服务移动互联网创业者,移动盈利指导。我们的目标是让盈利目标清晰可见!降低门槛,让缺乏经验、资金有限的个人和团队获得经验和机会,提高热情,激发产品。

【转载说明】   若上述素材出现侵权,请及时联系我们删除及进行处理:8088013@qq.com

评论

相关文章推荐

SELECT dw_posts.ID,dw_posts.post_title,dw_posts.post_content FROM dw_posts INNER JOIN dw_term_relationships ON (dw_posts.ID = dw_term_relationships.object_id) WHERE 1=1 AND(dw_term_relationships.term_taxonomy_id = 5246 ) AND dw_posts.post_type = 'post' AND (dw_posts.post_status = 'publish') GROUP BY dw_posts.ID ORDER BY RAND() LIMIT 0, 6

京ICP备15063977号-2 © 2012-2018 aiyingli.com. All Rights Reserved. 京公网安备 11010102003938号