在微信小程序中使用 swiper 做长列表数据展示?

前言

在小程序的开发中,实现长列表的数据展示和切换,一般都会选择 swiper 和  scroll-view 配合实现,原因无他,个人觉得就是用户体验好,开发快速、方便,但也不是毫无诟病

比如很棘手的问题: swiper 的高度问题

Part.1  需要实现的需求

Part.2  实现步骤

上面展示的效果就是选择 swiper 和  scroll-view 配合实现,接下来详细说明下产出过程:

 

首先,我把页面分为了两个部分,分别是 红色框内的内容 和 蓝色框内的内容,相信想使用 swiper 实现列表的同学已经遇到了这个棘手的问题:swiper的高度一直是 150px,它无法根据内容的大小自适应,除非自己手动设置其高度

这就让人很烦恼了,不知道其它同学怎么想,至少于我而言关于页面布局 能用 CSS 实现的打死也不用 JS ,所以自己研究了一波,没什么头绪就搜索了一波,发现至少暂时这个问题还真得需要 js 实现,😂

那就开始干吧

1. 实现头部:头部布局没什么说明的,就是有一点:使用 scroll-view 实现tab头部选项的时(如:星期一,星期二,星期三....),scroll-view 子元素不会自动横着排列需要点 css支持~

    分别为: white-space: nowrap   display: inline-block

   如:

 1 <view class="nav-box">
 2       <scroll-view class="tab-bar" :scroll-x="true" scroll-with-animation="true" :scroll-into-view="'tab_' + tabIndex">
 3           <view class="tab-item" 
 4                 v-for="(tab,index) in tabList" 
 5                 :key="tab.id"
 6                 :id="'tab_' + index"
 7                 @click="selectTitle(index)">
 8                <text class="tab-item-title" 
 9                      :class="tabIndex == index? 'active' : ''">{{tab.name}}</text>
10          </view>
11      </scroll-view>
12 </view>

 

    .nav-box {
        white-space: nowrap;  // 文本强制不换行
        background-color: #FFFFFF;
        .tab-bar {
            width: 750upx;
            height: 84upx;
            display: flex;
            .tab-item {
                height: 100%;
                padding: 0 30upx;
                display: inline-block; // 块级元素设置为行级元素
                .tab-item-title {
                    line-height: 84upx;
                    &.active {
                        font-weight: bold;
                        color: #1468FF;
                    }
                }
            }
        }
    }

2. 实现列表数据区(原理:利用API获取当前设备的屏幕可见区高度 - 头部红色框区域的高度 = 动态给swiper的高度),给 swiper 设置好高度之后利用 swiper-item  嵌套 scroll-view 的内容进行滑动

    ‘上滑加载新数据’ - 放弃使用滑动到底部的 onReachBottom 事件来触发,改用 scroll-view 的 @scrolltolower 事件触发

    ‘下拉刷新’ - 放弃使用 onPullDownRefresh 事件来触发,开启 scroll-view 的自定义下拉刷新 refresher-enabled,具体可查看官方API( https://uniapp.dcloud.io/component/scroll-view )

    注意:开启下拉刷新时还涉及到一个很细节的地方,如果 scroll-view 组件的高度是动态设置的话,初始值不能设为 0 ,否则在小程序端会导致下拉刷新操作拉不下来,建议设置一个大于 100 的值~

    如:

    设置 swiper 的高度(我当前的项目值,仅供参考

1 const res = uni.getSystemInfoSync();
2 this.swiperH = (res.windowHeight - uni.upx2px(210)); 

     

使用 swiper-item 嵌套 scroll-view 的内容

 1 <swiper class="swiper"
 2         :style="{'height': swiperH + 'px'}"
 3         :current="tabIndex"
 4         @change="swiperChange"
 5         duration="100">
 6         <swiper-item v-for="(item, index) in tabList"
 7                      class="swiper-item"
 8                      :key="index"
 9                      scroll-with-animation="true">
10                     <scroll-view class="swiper-item-scroll"
11                                  scroll-y="true"
12                                  :style="{'height': swiperH + 'px'}"
13                                  refresher-enabled
14                                  :refresher-triggered="triggered"
15                                  :refresher-threshold="80" 
16                                  @refresherrefresh="onRefresh"
17                                  @scrolltolower="scrolltolower">
18                             <!-- 内容组件-->
19                             <goodsItem ref="goodsItem"></goodsItem>
20                     </scroll-view>
21        </swiper-item>
22 </swiper>

 

     特此记录一波 ~~~

 

posted @ 2020-05-26 15:27  鲁肉饭  阅读(3316)  评论(0编辑  收藏  举报
UP