uniapp微信小程序swiper无限数量不卡顿轮播图

uniapp插件市场链接uniapp微信小程序swiper无限数量不卡顿轮播图组件 - DCloud 插件市场

兼容性:

    仅支持微信小程序平台(其他平台没做测试),有uniapp框架版和纯微信小程序开发工具版。

场景:

  你也遇到微信小程序swiper里要放大量数据的需求了吗,刚开始觉得就循环往里放么,但是真实操作时会发现刚开始滑着还行,到后面就卡的动不了了?

肿么办:

    原理是实际渲染的列表里只放最多3个元素(这里考虑到如果list只有1个或2个或3个的情况) ,在每次切换后更换这3个元素为最新的3个。

不想花时间去调试:

  已经有调试好的工具类了,你只需简单的引入和调用,无需关注实现过程,仅在合适的位置写自己的逻辑即可,工具类获取方式:点击上方插件市场链接。

代码调用示例:

<template>
    <view class="t-content">
        <!-- swiper示例 -->
        <swiper v-if="swiperList && swiperList.length>0" class="t-swiper" :duration="duration" :current="current"
            @animationfinish="itemChange">
            <swiper-item v-for="(item,index) in swiperList" :key="index">
                <!-- 这里是你可以任意定义的内容哦,例如答题类、视频轮播类... //开始 -->
                <view class="t-item-con t-wh-100p" :style="{'background-image': 'url('+item.bgImg+')'}">
                    <view class="t-item-title">{{item.title}}</view>
                    <text class="t-item-desc">{{item.desc}}</text>
                </view>
                <!-- 这里是你可以任意定义的内容哦,例如答题类、视频轮播类... //结束 -->
            </swiper-item>
        </swiper>
        <!-- 下面这个是为了演示快速跳转到某一个item -->
        <view class="t-leap-desc">
            注:上面swiper中共10000个带图片的item,点击下方序号快速跳转:
        </view>
        <view class="t-leap">
            <view @click="leapTo" data-num="9">9</view>
            <view @click="leapTo" data-num="99">99</view>
            <view @click="leapTo" data-num="999">999</view>
            <view @click="leapTo" data-num="1999">1999</view>
            <view @click="leapTo" data-num="2999">2999</view>
            <view @click="leapTo" data-num="3999">3999</view>
            <view @click="leapTo" data-num="4999">4999</view>
            <view @click="leapTo" data-num="5999">5999</view>
            <view @click="leapTo" data-num="6999">6999</view>
            <view @click="leapTo" data-num="7999">7999</view>
            <view @click="leapTo" data-num="8999">8999</view>
            <view @click="leapTo" data-num="9999">9999</view>
        </view>
    </view>
</template>
 
<script>
    //这里引入封装的工具类方法
    import { initSwiper, leapToItem, changeSwiperItem ,defaultParams } from '@/common/kevy-enhanced-swiper-1.0.js';
    //list -- swiper所有数据的存放列表
    //duration -- 初始化设置的过渡时间
    var { list, duration } = defaultParams;
    //测试图片背景,这块为了测试带图片且数据量大也不存在性能问题
    const bgImg = 'https://img-blog.csdnimg.cn/140a01b8ad3f46bb9b970fdd85433ebe.png';
    export default {
        data() {
            return {
                swiperList: [], //swiper实际列表,里面放的swiper-item数量为1-3个
                current: 0, //swiper实际列表(swiperList)中当前可以看到的那个swiper-item对应的下标,从0开始
                duration: duration, //swipper-item元素切换动画过渡时间
                currItemNo: 1 ,//当前显示的swiper-item在所有数据的存放列表(list)中的序号,例如总数量list里共10000条数据,currItemNo=150是指当前显示的是第150条数据
            }
        },
        onLoad() {
            //这里去请求所有数据,如果接口是分页的就多请求几次拿到所有数据,不存在性能问题
            // uni.request({
            // ...请求逻辑
            // () => { list = res.data.list }
            // })
            //这里模拟请求到了所有数据,例如10000条,然后放到list数组里
            for (let i = 0; i < 10000; i++) {
                list.push({
                    bgImg: bgImg,
                    title: "[第" + (i + 1) + "个元素]我是一个无限制数量高性能的swiper",
                    desc: "A. [第" + (i + 1) +
                        "个元素]实现原理:\n\nB. swiper里永远最多只放3个元素,\n\nC. 在swiper切换时根据原来的下标计算新的需要显示的item对应下标,\n\nD. 然后组装好新的最多3个item数据渲染到页面"
                });
            }
            //请求到所有数据后放到list变量里后,初始化swiper
            initSwiper(this, list, () => {
                //这里是初始化完后的回调,你可以写自己的逻辑了,例如拿到当前swiper-item
                console.log(this.swiperList[this.current]);
            });
        },
        methods: {
            /**
             * swiper切换事件,这里监听的是切换完成动画事件
             */
            itemChange(e) {
                changeSwiperItem(this, Number(e.detail.current), list, duration, () => {
                    //切换完成
                    //这里可以写自己的逻辑啦,例如去判断当前item是否收藏...
                    console.log("切换完成,当前显示的是===", this.swiperList[this.current].title)
                });
            },
            /**
             * 跳到第n个item数据,n为序号从1开始
             */
            leapTo(e) {
                leapToItem(this, Number(e.currentTarget.dataset.num), list, duration, () => {
                    //这里是跳完之后,此时页面已经显示第n个item了,
                    //你可以在这里写自己的逻辑了,例如判断当前item是否收藏,是否错题...
                    console.log("已经跳转到第" + Number(e.currentTarget.dataset.num) + "个item啦");
                });
            }
        }
    }
</script>
 
<style lang="scss" scoped>
    .t-content {
        background-color: #f7f7f7;
        min-height: 100vh;
    }
 
    .t-h-100p {
        height: 100%;
    }
    
    .t-hover{
        opacity: 0.7;
    }
 
    .t-w-100p {
        width: 100%;
    }
 
    .t-wh-100p {
        width: 100%;
        height: 100%;
    }
 
    .t-swiper {
        width: 100%;
        box-sizing: border-box;
        height: 500rpx;
    }
 
    .t-item-con {
        background-size: 100% 100%;
        background-repeat: no-repeat;
        display: flex;
        flex-direction: column;
        justify-content: flex-start;
        align-items: flex-start;
        padding: 30rpx;
        box-sizing: border-box;
    }
 
    .t-item-title {
        font-size: 36rpx;
        color: #ffffff;
        font-weight: bold;
        text-align: justify;
    }
 
    .t-item-desc {
        font-size: 28rpx;
        color: #ffffff;
        margin-top: 30rpx;
        text-align: justify;
    }
    
    .t-leap-desc {
        font-size: 28rpx;
        width: 690rpx;
        margin: 60rpx auto 0rpx;
        color: black;
    }
 
    .t-leap {
        width: 663rpx;
        height: 100rpx;
        margin: 0 auto;
        box-sizing: border-box;
        padding: 15rpx;
        display: flex;
        flex-direction: row;
        justify-content: flex-start;
        align-items: center;
        flex-wrap: wrap;
    }
 
    .t-leap view {
        font-size: 24rpx;
        color: #fff;
        padding: 15rpx;
        background: #42b983;
        border-radius: 10rpx;
        width: 57rpx;
        height: 30rpx;
        text-align: center;
        line-height: 30rpx;
        margin: 10rpx;
    }
</style>

纯小程序开发工具版有么:
当然是有了,点击文章开头链接,愉快的打包下载吧,插件包内含微信开发工具版和uniapp版全部代码啦

微信小程序版调用示例:
index.wxml代码:

<view class="t-content">
  <!-- swiper示例 -->
  <swiper wx:if="{{swiperList && swiperList.length>0}}" class="t-swiper" duration="{{duration}}" current="{{current}}" bindanimationfinish="itemChange">
    <swiper-item wx:for="{{swiperList}}" wx:for-item="item" wx:key="index" wx:for-index="index">
      <!-- 这里是你可以任意定义的内容哦,例如答题类、视频轮播类... //开始 -->
      <view class="t-item-con t-wh-100p" style="background-image: url({{item.bgImg}});">
        <view class="t-item-title">{{item.title}}</view>
        <text class="t-item-desc">{{item.desc}}</text>
      </view>
      <!-- 这里是你可以任意定义的内容哦,例如答题类、视频轮播类... //结束 -->
    </swiper-item>
  </swiper>
  <!-- 下面这个是为了演示快速跳转到某一个item -->
  <view class="t-leap-desc">
    注:上面swiper中共10000个带图片的item,点击下方序号快速跳转:
  </view>
  <view class="t-leap">
    <view bindtap="leapTo" data-num="9">9</view>
    <view bindtap="leapTo" data-num="99">99</view>
    <view bindtap="leapTo" data-num="999">999</view>
    <view bindtap="leapTo" data-num="1999">1999</view>
    <view bindtap="leapTo" data-num="2999">2999</view>
    <view bindtap="leapTo" data-num="3999">3999</view>
    <view bindtap="leapTo" data-num="4999">4999</view>
    <view bindtap="leapTo" data-num="5999">5999</view>
    <view bindtap="leapTo" data-num="6999">6999</view>
    <view bindtap="leapTo" data-num="7999">7999</view>
    <view bindtap="leapTo" data-num="8999">8999</view>
    <view bindtap="leapTo" data-num="9999">9999</view>
  </view>
</view>

index.js代码:

//这里引入封装的工具类方法
import { initSwiper, leapToItem, changeSwiperItem, defaultParams } from '../../common/kevy-enhanced-swiper-wx-1.0.js';
//list -- swiper所有数据的存放列表
//duration -- 初始化设置的过渡时间
var { list, duration } = defaultParams;
//测试图片背景,这块为了测试带图片且数据量大也不存在性能问题
const bgImg = 'https://img-blog.csdnimg.cn/140a01b8ad3f46bb9b970fdd85433ebe.png';
Page({
 
  /**
   * 页面的初始数据
   */
  data: {
    swiperList: [], //swiper实际列表,里面放的swiper-item数量为1-3个
    current: 0, //swiper实际列表(swiperList)中当前可以看到的那个swiper-item对应的下标,从0开始
    duration: duration, //swipper-item元素切换动画过渡时间
    currItemNo: 1,//当前显示的swiper-item在所有数据的存放列表(list)中的序号,例如总数量list里共10000条数据,currItemNo=150是指当前显示的是第150条数据
  },
 
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    //这里去请求所有数据,如果接口是分页的就多请求几次拿到所有数据,不存在性能问题
    // uni.request({
    // ...请求逻辑
    // () => { list = res.data.list }
    // })
    //这里模拟请求到了所有数据,例如10000条,然后放到list数组里
    for (let i = 0; i < 10000; i++) {
      list.push({
        bgImg: bgImg,
        title: "[第" + (i + 1) + "个元素]我是一个无限制数量高性能的swiper",
        desc: "A. [第" + (i + 1) +
          "个元素]实现原理:\n\nB. swiper里永远最多只放3个元素,\n\nC. 在swiper切换时根据原来的下标计算新的需要显示的item对应下标,\n\nD. 然后组装好新的最多3个item数据渲染到页面"
      });
    }
    //请求到所有数据后放到list变量里后,初始化swiper
    initSwiper(this, list, () => {
      //这里是初始化完后的回调,你可以写自己的逻辑了,例如拿到当前swiper-item
      console.log(this.data.swiperList[this.data.current]);
    });
  },
  /**
   * swiper切换事件,这里监听的是切换完成动画事件
   */
  itemChange(e) {
    changeSwiperItem(this, Number(e.detail.current), list, duration, () => {
      //切换完成
      //这里可以写自己的逻辑啦,例如去判断当前item是否收藏...
      console.log("切换完成,当前显示的是===", this.data.swiperList[this.data.current].title)
    });
  },
  /**
   * 跳到第n个item数据,n为序号从1开始
   */
  leapTo(e) {
    leapToItem(this, Number(e.currentTarget.dataset.num), list, duration, () => {
      //这里是跳完之后,此时页面已经显示第n个item了,
      //你可以在这里写自己的逻辑了,例如判断当前item是否收藏,是否错题...
      console.log("已经跳转到第" + Number(e.currentTarget.dataset.num) + "个item啦");
    });
  }
 
})

index.wxss代码:

.t-content {
  background-color: #f7f7f7;
  min-height: 100vh;
}
 
.t-h-100p {
  height: 100%;
}
 
.t-hover{
  opacity: 0.7;
}
 
.t-w-100p {
  width: 100%;
}
 
.t-wh-100p {
  width: 100%;
  height: 100%;
}
 
.t-swiper {
  width: 100%;
  box-sizing: border-box;
  height: 500rpx;
}
 
.t-item-con {
  background-size: 100% 100%;
  background-repeat: no-repeat;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: flex-start;
  padding: 30rpx;
  box-sizing: border-box;
}
 
.t-item-title {
  font-size: 36rpx;
  color: #ffffff;
  font-weight: bold;
  text-align: justify;
}
 
.t-item-desc {
  font-size: 28rpx;
  color: #ffffff;
  margin-top: 30rpx;
  text-align: justify;
}
 
.t-leap-desc {
  font-size: 28rpx;
  width: 690rpx;
  margin: 60rpx auto 0rpx;
  color: black;
}
 
.t-leap {
  width: 663rpx;
  height: 100rpx;
  margin: 0 auto;
  box-sizing: border-box;
  padding: 15rpx;
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  align-items: center;
  flex-wrap: wrap;
}
 
.t-leap view {
  font-size: 24rpx;
  color: #fff;
  padding: 15rpx;
  background: #42b983;
  border-radius: 10rpx;
  width: 57rpx;
  height: 30rpx;
  text-align: center;
  line-height: 30rpx;
  margin: 10rpx;
}

最后,如果本文对您有帮助了,请帮忙点下赞哦,以便为更多的人提供参考。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容