免费男女视频_国产系列 视频二区_羞羞视频免费入口网站_久国久产久精永久网页_国产免费观看av_一区二区三区日韩在线观看

微信小程序之加载更多(分页加载)实例 —— 微信小程序实战系列(2)

loadmore

加載更多(分頁加載)

 

當用戶打開一個頁面時,假設后臺數據量龐大時,一次性地返回所有數據給客戶端,頁面的打開速度就會有所下降,而且用戶只看上面的內容而不需要看后面的內容時,也浪費用戶流量,基于優化的角度來考慮,后臺不要一次性返回所有數據,當用戶有需要再往下翻的時候,再加載更加數據出來。

 

業務需求:

列表滾動到底部時,繼續往上拉,加載更多內容

 

必備參數:

(1)pageindex: 1 //第幾次加載

2callbackcount: 15 //需要返回數據的個數

其他參數:

根據接口的所需參數

 

實現原理:

當第一次訪問接口時,傳遞2個必備參數(第1次加載,需要返回數據的個數為15個),和其他參數(需要搜索的字符串)給后臺,后臺返回第一次數據過來。在請求成功的的回調函數中,判斷返回的數據是否>0,是,則取出數據,渲染視圖層,并把“上拉加載”顯示在列表底部;否,則沒有數據可取,并把“沒有更多”顯示在列表底部,同時把“上拉加載”隱藏掉。

當用戶已經滾動到列表底部(這里使用到小程序提供的scroll-view組件的bindscrolltolower事件),觸發bindscrolltolower事件,參數pageindex+1,再把2個必備參數(第2次加載,需要返回數據的個數為15個)和其他參數(需要搜索的字符串)給后臺,后臺把其余的數據返回給前臺,前臺在原來數據的基礎上添加數據。

 

 

示例:

wxml:

[html] view plain copy
 print?
  1. <view class="search">  
  2.   <view class="search-bar">  
  3.     <view class="search-wrap">  
  4.         <icon type="search" size="16" class="icon-search" />  
  5.         <input type="text" placeholder="請輸入搜索內容" class="search-input" name="searchKeyword" bindinput="bindKeywordInput" value="{{searchKeyword}}" />  
  6.     </view>  
  7.     <view class="search-cancel" bindtap="keywordSearch">搜索</view>  
  8.   </view>  
  9.   <view class="search-result">  
  10.     <scroll-view scroll-y="true" bindscrolltolower="searchScrollLower">  
  11.       <view class="result-item" wx:for="{{searchSongList}}" wx:key="unique"  data-data="{{item}}" >  
  12.         <view class="icon{{item.isonly=='0' ? ' nocopyright' : ''}}"></view>  
  13.         <text class="title">{{item.songname}}</text>  
  14.         <view class="subtitle">  
  15.           <text wx:for="{{item.singer}}" wx:key="unique">{{item.name}}</text>  
  16.         </view>  
  17.       </view>  
  18.       <view class="loading" hidden="{{!searchLoading}}">正在載入更多...</view>  
  19.       <view class="loading complete" hidden="{{!searchLoadingComplete}}">已加載全部</view>  
  20.     </scroll-view>    
  21.   </view>  
  22. </view>  


js:

[javascript] view plain copy
 print?
  1. var util = require('../../utils/util.js')  
  2. Page({  
  3.   data: {  
  4.     searchKeyword: '',  //需要搜索的字符  
  5.     searchSongList: [], //放置返回數據的數組  
  6.     isFromSearch: true,   // 用于判斷searchSongList數組是不是空數組,默認true,空的數組  
  7.     searchPageNum: 1,   // 設置加載的第幾次,默認是第一次  
  8.     callbackcount: 15,      //返回數據的個數  
  9.     searchLoading: false//"上拉加載"的變量,默認false,隱藏  
  10.     searchLoadingComplete: false  //“沒有數據”的變量,默認false,隱藏  
  11.   },  
  12.   //輸入框事件,每輸入一個字符,就會觸發一次  
  13.   bindKeywordInput: function(e){  
  14.     console.log("輸入框事件")  
  15.     this.setData({  
  16.       searchKeyword: e.detail.value  
  17.     })  
  18.   },  
  19.   //搜索,訪問網絡  
  20.   fetchSearchList: function(){  
  21.     let that = this;  
  22.     let searchKeyword = that.data.searchKeyword,//輸入框字符串作為參數  
  23.         searchPageNum = that.data.searchPageNum,//把第幾次加載次數作為參數  
  24.         callbackcount =that.data.callbackcount; //返回數據的個數  
  25.     //訪問網絡  
  26.     util.getSearchMusic(searchKeyword, searchPageNum,callbackcount, function(data){  
  27.       console.log(data)  
  28.       //判斷是否有數據,有則取數據  
  29.       if(data.data.song.curnum != 0){  
  30.         let searchList = [];  
  31.         //如果isFromSearch是true從data中取出數據,否則先從原來的數據繼續添加  
  32.         that.data.isFromSearch ? searchList=data.data.song.list : searchList=that.data.searchSongList.concat(data.data.song.list)  
  33.         that.setData({  
  34.           searchSongList: searchList, //獲取數據數組  
  35.           zhida: data.data.zhida, //存放歌手屬性的對象  
  36.           searchLoading: true   //把"上拉加載"的變量設為false,顯示  
  37.         });  
  38.       //沒有數據了,把“沒有數據”顯示,把“上拉加載”隱藏  
  39.       }else{  
  40.         that.setData({  
  41.           searchLoadingComplete: true//把“沒有數據”設為true,顯示  
  42.           searchLoading: false  //把"上拉加載"的變量設為false,隱藏  
  43.         });  
  44.       }  
  45.     })  
  46.   },  
  47.   //點擊搜索按鈕,觸發事件  
  48.   keywordSearch: function(e){  
  49.     this.setData({    
  50.       searchPageNum: 1,   //第一次加載,設置1  
  51.       searchSongList:[],  //放置返回數據的數組,設為空  
  52.       isFromSearch: true,  //第一次加載,設置true  
  53.       searchLoading: true,  //把"上拉加載"的變量設為true,顯示  
  54.       searchLoadingComplete:false //把“沒有數據”設為false,隱藏  
  55.     })  
  56.     this.fetchSearchList();  
  57.   },  
  58.   //滾動到底部觸發事件  
  59.   searchScrollLower: function(){  
  60.     let that = this;  
  61.     if(that.data.searchLoading && !that.data.searchLoadingComplete){  
  62.       that.setData({  
  63.         searchPageNum: that.data.searchPageNum+1,  //每次觸發上拉事件,把searchPageNum+1  
  64.         isFromSearch: false  //觸發到上拉事件,把isFromSearch設為為false  
  65.       });  
  66.       that.fetchSearchList();  
  67.     }  
  68.   }  
  69. })  


util.js:

[javascript] view plain copy
 print?
  1. function getSearchMusic(keyword, pageindex, callbackcount, callback){  
  2.   wx.request({  
  3.     url: 'https://c.y.qq.com/soso/fcgi-bin/search_for_qq_cp',  
  4.     data: {  
  5.       g_tk: 5381,  
  6.       uin: 0,  
  7.       format: 'json',  
  8.       inCharset: 'utf-8',  
  9.       outCharset: 'utf-8',  
  10.       notice: 0,  
  11.       platform: 'h5',  
  12.       needNewCode: 1,  
  13.       w: keyword,  
  14.       zhidaqu: 1,  
  15.       catZhida: 1,  
  16.       t: 0,  
  17.       flag: 1,  
  18.       ie: 'utf-8',  
  19.       sem: 1,  
  20.       aggr: 0,  
  21.       perpage: 20,  
  22.       n: callbackcount,  //返回數據的個數  
  23.       p: pageindex,  
  24.       remoteplace: 'txt.mqq.all',  
  25.       _: Date.now()  
  26.     },  
  27.     method: 'GET',  
  28.     header: {'content-Type''application/json'},  
  29.     success: function(res){  
  30.       if(res.statusCode == 200){  
  31.         callback(res.data);  
  32.       }  
  33.     }  
  34.   })  
  35. }  
  36.   
  37. module.exports = {  
  38.   getSearchMusic: getSearchMusic  
  39. }  


wxss:

[css] view plain copy
 print?
  1. page{  
  2.   display: flex;  
  3.   flex-direction: column;  
  4.   height100%;  
  5. }  
  6.   
  7. /*搜索*/  
  8. .search{  
  9.   flex: auto;  
  10.   display: flex;  
  11.   flex-direction: column;  
  12.   background#fff;  
  13. }  
  14. .search-bar{  
  15.   flex: none;  
  16.   display: flex;  
  17.   align-items: center;  
  18.   justify-content: space-between;  
  19.   padding20rpx;  
  20.   background#f4f4f4;  
  21. }  
  22. .search-wrap{  
  23.   positionrelative;  
  24.   flex: auto;  
  25.   display: flex;  
  26.   align-items: center;  
  27.   height80rpx;  
  28.   padding0 20rpx;  
  29.   background#fff;  
  30.   border-radius: 6rpx;  
  31. }  
  32. .search-wrap .icon-search{  
  33.   margin-right10rpx;  
  34. }  
  35. .search-wrap .search-input{  
  36.   flex: auto;  
  37.   font-size28rpx;  
  38. }  
  39. .search-cancel{  
  40.   padding0 20rpx;  
  41.   font-size28rpx;  
  42. }  
  43.   
  44. /*搜索結果*/  
  45. .search-result{  
  46.   flex: auto;  
  47.   positionrelative;  
  48. }  
  49. .search-result scroll-view{  
  50.   positionabsolute;  
  51.   bottom: 0;  
  52.   left: 0;  
  53.   right: 0;  
  54.   top: 0;  
  55. }  
  56. .result-item{  
  57.   positionrelative;  
  58.   display: flex;  
  59.   flex-direction: column;  
  60.   padding20rpx 0 20rpx 110rpx;  
  61.   overflowhidden;  
  62.   border-bottom2rpx solid #e5e5e5;  
  63. }  
  64.   
  65. .result-item .media{  
  66.   positionabsolute;  
  67.   left: 16rpx;  
  68.   top: 16rpx;  
  69.   width80rpx;  
  70.   height80rpx;  
  71.   border-radius: 999rpx;  
  72. }  
  73. .result-item .title,  
  74. .result-item .subtitle{  
  75.   overflowhidden;  
  76.   text-overflow: ellipsis;  
  77.   white-spacenowrap;  
  78.   line-height36rpx;  
  79. }  
  80. .result-item .title{  
  81.   margin-bottom4rpx;  
  82.   color#000;  
  83. }  
  84. .result-item .subtitle{  
  85.   color#808080;  
  86.   font-size24rpx;  
  87. }  
  88. .result-item:first-child .subtitle text{  
  89.   margin-right20rpx;  
  90. }  
  91. .result-item:not(:first-child) .subtitle text:not(:first-child):before{  
  92.   content'/';  
  93.   margin0 8rpx;  
  94. }  
  95. .loading{  
  96.   padding10rpx;  
  97.   text-aligncenter;  
  98. }  
  99. .loading:before{  
  100.   display: inline-block;  
  101.   margin-right5rpx;  
  102.   vertical-alignmiddle;  
  103.   content'';  
  104.   width40rpx;  
  105.   height40rpx;  
  106.   backgroundurl(../../images/icon-loading.png) no-repeat;  
  107.   background-size: contain;  
  108.   animation: rotate 1s linear infinite;  
  109. }  
  110. .loading.complete:before{  
  111.   displaynone;  
  112. }  


運行:

主站蜘蛛池模板: 激情在线视频 | 亚洲第一页视频 | www.成人免费 | 欧美成人一二三区 | 中文字幕在线观看视频一区 | 亚洲狠狠入 | 国产一区二区三区四区五区在线 | 成年人国产视频 | 免费一级欧美在线观看视频 | 91懂色| 成人9禁啪啪无遮挡免费 | 久久超| 黄色免费在线网站 | 亚洲成人福利网站 | 一本色道精品久久一区二区三区 | 欧美人与性禽动交精品 | www.99av| av色偷偷 | 久在线播放 | 成人18在线 | av色在线观看 | 久久久99精品视频 | 一区二区美女视频 | 久久久久久亚洲综合影院红桃 | a集毛片| 黄色网址免费入口 | 天天色宗合 | 久久综合一区 | 日韩视频区 | 成人男女啪啪免费观看网站四虎 | 美女视频黄a视频免费全过程 | 国产一区二区久久精品 | 免费啪视频在线观看 | 日日狠狠久久偷偷四色综合免费 | 91精品国产91久久久久久吃药 | 国产精品美女久久久久久不卡 | 成人黄色网战 | 久久精品国产一区二区电影 | 精品亚洲免费 | 青青草最新网址 | 久久久久91视频 |