银白叹咏调 發表於 2019-6-12 23:47:00

小程序开发日志-7、动态加载上下滚动数据列表(小程序开发)

<p><img src="https://img2018.cnblogs.com/blog/1412174/201906/1412174-20190612213615692-1309400627.png"></p>
<p>&nbsp;实现如上图所示的内容,利用微信小程序自带的swiper标签,设置垂直滚动,原理就是这么简单,但是,如果需要动态加载数据呢?</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">='flex </span><span style="color: rgba(255, 0, 0, 1)">news'</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">='news-left'</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>头条<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">swiper </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">='news-right' </span><span style="color: rgba(255, 0, 0, 1)">vertical</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)"> autoplay</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)"> interval</span><span style="color: rgba(0, 0, 255, 1)">="3000"</span><span style="color: rgba(255, 0, 0, 1)"> circular</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">swiper-item</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">navigator </span><span style="color: rgba(255, 0, 0, 1)">url</span><span style="color: rgba(0, 0, 255, 1)">='../news/news' </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">='news-content' wx:for="{{2}}"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>新闻标题<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">navigator</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">swiper-item</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">swiper</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp;</p>
<p>比如:我有n条数据,但现在是每次加载的是两条数据,那么需要创建多少个swiper-item呢?</p>
<p>通过一个小小的计算方式来实现,相信大家动一下脑筋就明白。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">var swiperItem=function(length,item){
if(length%item==0){
    return length / item;
}else{
    return (length /item)+1;
}
}<br></span></pre>
<p>module.exports = {<br>      swiperItem:swiperItem //暴露该返回值<br>};</p>
<pre><span style="color: rgba(0, 0, 0, 1)">&nbsp;</span></pre>
</div>
<p>这个方法我是用在一个工具类中,我觉得在开发小程序的过程中,也可以尽量的做到封装和继承。比如:写一个工具类,将所有属于数据转化这类的方法可以封装在这个js文件中,然后通过引用,直接调用这个方法,免去了在page页面js中代码过多,不便于后面维护。由于接手的是已完成的项目,所以用的是js语法,没有用ts语法,学过Java或其他面向对象编程思想的同学,可以尝试用ts语法来开发小程序,好处就不多说了。</p>
<p>在index.js文件中引用该方</p>
<div class="cnblogs_code">
<pre><em id="__mceDel">var util=require("../../../../utils/util.js");//引用<br>Page({<br>  data{<br>    barNum:0<br>  }<br>  onLoad: function(options) {<br>    that.setData({
      barNum:util.swiperItem(res.length,2) //res数据为向后台请求的数据,2是在每个swiper-item中显示的条数
      })
  }
})</em></pre>
</div>
<p>这样就可以知道可以分多少个swiper-item展示了,(wx:for="{{barNum}}")但是,在每个swi-item中要显示两条数据,那n条数据中,怎么一一对应插入到navigator中呢?<span style="color: rgba(128, 0, 0, 1); font-family: &quot;Courier New&quot;; font-size: 12px"><br></span></p>
<p>这里写一下总体思路吧:假如有10条数据,那肯定是分为5页显示了,那10条数据如何放入到navigator中呢?可以利用数组下标来表示:</p>
<p>newsList表示json数组,每条新闻标题可以表示为:newsList,newsList.....这样表示下去一直到newsList;</p>
<p>这个时候定义的barNum这个变量肯定是5,也就是说wx:for="{{5}}",下标index1为,0,1,2,3,4可以从这个下标入手,</p>
<p>还有另一个下标,那就是在navigator中的,wx:for="{{2}}",因为每次两条都是写死的,所以,每次的index2下标都是0,1</p>
<p>我的计算思路是这样的:下标=(index1*2)+index2,这样循环newsList数组的下标都是遵循0,1,2,3...的</p>
<p>具体代码入下;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">='flex </span><span style="color: rgba(255, 0, 0, 1)">news'</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">view </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">='news-left'</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>头条<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">swiper </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">='news-right' </span><span style="color: rgba(255, 0, 0, 1)">vertical</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)"> autoplay</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)"> interval</span><span style="color: rgba(0, 0, 255, 1)">="3000"</span><span style="color: rgba(255, 0, 0, 1)"> circular</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">swiper-item </span><span style="color: rgba(255, 0, 0, 1)">wx:for</span><span style="color: rgba(0, 0, 255, 1)">="{{barNum}}"</span><span style="color: rgba(255, 0, 0, 1)"> wx:for-index</span><span style="color: rgba(0, 0, 255, 1)">="idx1"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">navigator </span><span style="color: rgba(255, 0, 0, 1)">url</span><span style="color: rgba(0, 0, 255, 1)">='../news/news' </span><span style="color: rgba(255, 0, 0, 1)">class</span><span style="color: rgba(0, 0, 255, 1)">='news-content' </span><span style="color: rgba(255, 0, 0, 1)">wx:for</span><span style="color: rgba(0, 0, 255, 1)">="{{2}}"</span><span style="color: rgba(255, 0, 0, 1)"> wx:for-index</span><span style="color: rgba(0, 0, 255, 1)">="idx2"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>{{topicList[(idx1*2)+idx2].title}}<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">navigator</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">swiper-item</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">swiper</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">view</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>    </pre>
</div>
<p>&nbsp;</p>
<p>当然,肯定会有 更好的计算分页方法,推算不易,不喜勿喷。。。。</p><br><br>
来源:https://www.cnblogs.com/liao123/p/11012963.html
頁: [1]
查看完整版本: 小程序开发日志-7、动态加载上下滚动数据列表(小程序开发)