当前位置:   article > 正文

微信小程序swiper不限数量不卡顿轮播图优化组件(含uniapp版和纯微信开发者工具版),欢迎打包下载啦_swiper小程序

swiper小程序

兼容性:

        支持微信小程序平台,有uniapp框架版纯微信小程序开发工具版。

问题:

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

肿么办:

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

调试花时间:

       已经有调试好的工具类了,你只需简单的引入和调用,无需关注实现过程,仅在合适的位置写自己的逻辑即可。

演示效果:

         微信扫一扫下方二维码查看演示效果:

        ​ 

演示页面截图:

​ 

  uniapp版代码调用示例: 

  1. <template>
  2. <view class="t-content">
  3. <!-- swiper示例 -->
  4. <swiper v-if="swiperList && swiperList.length>0" class="t-swiper" :duration="duration" :current="current"
  5. @animationfinish="itemChange">
  6. <swiper-item v-for="(item,index) in swiperList" :key="index">
  7. <!-- 这里是你可以任意定义的内容哦,例如答题类、视频轮播类... //开始 -->
  8. <view class="t-item-con t-wh-100p" :style="{'background-image': 'url('+item.bgImg+')'}">
  9. <view class="t-item-title">{{item.title}}</view>
  10. <text class="t-item-desc">{{item.desc}}</text>
  11. </view>
  12. <!-- 这里是你可以任意定义的内容哦,例如答题类、视频轮播类... //结束 -->
  13. </swiper-item>
  14. </swiper>
  15. <!-- 下面这个是为了演示快速跳转到某一个item -->
  16. <view class="t-leap-desc">
  17. 注:上面swiper中共10000个带图片的item,点击下方序号快速跳转:
  18. </view>
  19. <view class="t-leap">
  20. <view @click="leapTo" data-num="9">9</view>
  21. <view @click="leapTo" data-num="99">99</view>
  22. <view @click="leapTo" data-num="999">999</view>
  23. <view @click="leapTo" data-num="1999">1999</view>
  24. <view @click="leapTo" data-num="2999">2999</view>
  25. <view @click="leapTo" data-num="3999">3999</view>
  26. <view @click="leapTo" data-num="4999">4999</view>
  27. <view @click="leapTo" data-num="5999">5999</view>
  28. <view @click="leapTo" data-num="6999">6999</view>
  29. <view @click="leapTo" data-num="7999">7999</view>
  30. <view @click="leapTo" data-num="8999">8999</view>
  31. <view @click="leapTo" data-num="9999">9999</view>
  32. </view>
  33. </view>
  34. </template>
  35. <script>
  36. //这里引入封装的工具类方法,插件下载后含uniapp版和微信开发工具版工具类文件咯
  37. import { initSwiper, leapToItem, changeSwiperItem ,defaultParams } from '@/common/kevy-enhanced-swiper-1.0.js';
  38. //list -- swiper所有数据的存放列表
  39. //duration -- 初始化设置的过渡时间
  40. var { list, duration } = defaultParams;
  41. //测试图片背景,这块为了测试带图片且数据量大也不存在性能问题
  42. const bgImg = 'https://img-blog.csdnimg.cn/140a01b8ad3f46bb9b970fdd85433ebe.png';
  43. export default {
  44. data() {
  45. return {
  46. swiperList: [], //swiper实际列表,里面放的swiper-item数量为1-3个
  47. current: 0, //swiper实际列表(swiperList)中当前可以看到的那个swiper-item对应的下标,从0开始
  48. duration: duration, //swipper-item元素切换动画过渡时间
  49. currItemNo: 1 ,//当前显示的swiper-item在所有数据的存放列表(list)中的序号,例如总数量list里共10000条数据,currItemNo=150是指当前显示的是第150条数据
  50. }
  51. },
  52. onLoad() {
  53. //这里去请求所有数据,如果接口是分页的就多请求几次拿到所有数据,不存在性能问题
  54. // uni.request({
  55. // ...请求逻辑
  56. // () => { list = res.data.list }
  57. // })
  58. //这里模拟请求到了所有数据,例如10000条,然后放到list数组里
  59. for (let i = 0; i < 10000; i++) {
  60. list.push({
  61. bgImg: bgImg,
  62. title: "[第" + (i + 1) + "个元素]我是一个无限制数量高性能的swiper",
  63. desc: "A. [第" + (i + 1) +
  64. "个元素]实现原理:\n\nB. swiper里永远最多只放3个元素,\n\nC. 在swiper切换时根据原来的下标计算新的需要显示的item对应下标,\n\nD. 然后组装好新的最多3个item数据渲染到页面"
  65. });
  66. }
  67. //请求到所有数据后放到list变量里后,初始化swiper
  68. initSwiper(this, list, () => {
  69. //这里是初始化完后的回调,你可以写自己的逻辑了,例如拿到当前swiper-item
  70. console.log(this.swiperList[this.current]);
  71. });
  72. },
  73. methods: {
  74. /**
  75. * swiper切换事件,这里监听的是切换完成动画事件
  76. */
  77. itemChange(e) {
  78. changeSwiperItem(this, Number(e.detail.current), list, duration, () => {
  79. //切换完成
  80. //这里可以写自己的逻辑啦,例如去判断当前item是否收藏...
  81. console.log("切换完成,当前显示的是===", this.swiperList[this.current].title)
  82. });
  83. },
  84. /**
  85. * 跳到第n个item数据,n为序号从1开始
  86. */
  87. leapTo(e) {
  88. leapToItem(this, Number(e.currentTarget.dataset.num), list, duration, () => {
  89. //这里是跳完之后,此时页面已经显示第n个item了,
  90. //你可以在这里写自己的逻辑了,例如判断当前item是否收藏,是否错题...
  91. console.log("已经跳转到第" + Number(e.currentTarget.dataset.num) + "个item啦");
  92. });
  93. }
  94. }
  95. }
  96. </script>
  97. <style lang="scss" scoped>
  98. .t-content {
  99. background-color: #f7f7f7;
  100. min-height: 100vh;
  101. }
  102. .t-h-100p {
  103. height: 100%;
  104. }
  105. .t-hover{
  106. opacity: 0.7;
  107. }
  108. .t-w-100p {
  109. width: 100%;
  110. }
  111. .t-wh-100p {
  112. width: 100%;
  113. height: 100%;
  114. }
  115. .t-swiper {
  116. width: 100%;
  117. box-sizing: border-box;
  118. height: 500rpx;
  119. }
  120. .t-item-con {
  121. background-size: 100% 100%;
  122. background-repeat: no-repeat;
  123. display: flex;
  124. flex-direction: column;
  125. justify-content: flex-start;
  126. align-items: flex-start;
  127. padding: 30rpx;
  128. box-sizing: border-box;
  129. }
  130. .t-item-title {
  131. font-size: 36rpx;
  132. color: #ffffff;
  133. font-weight: bold;
  134. text-align: justify;
  135. }
  136. .t-item-desc {
  137. font-size: 28rpx;
  138. color: #ffffff;
  139. margin-top: 30rpx;
  140. text-align: justify;
  141. }
  142. .t-leap-desc {
  143. font-size: 28rpx;
  144. width: 690rpx;
  145. margin: 60rpx auto 0rpx;
  146. color: black;
  147. }
  148. .t-leap {
  149. width: 663rpx;
  150. height: 100rpx;
  151. margin: 0 auto;
  152. box-sizing: border-box;
  153. padding: 15rpx;
  154. display: flex;
  155. flex-direction: row;
  156. justify-content: flex-start;
  157. align-items: center;
  158. flex-wrap: wrap;
  159. }
  160. .t-leap view {
  161. font-size: 24rpx;
  162. color: #fff;
  163. padding: 15rpx;
  164. background: #42b983;
  165. border-radius: 10rpx;
  166. width: 57rpx;
  167. height: 30rpx;
  168. text-align: center;
  169. line-height: 30rpx;
  170. margin: 10rpx;
  171. }
  172. </style>

纯小程序开发工具版有么:

        当然是有了,一切尽在插件包里,包括下方的代码及工具类文件哦。

微信小程序版调用示例:

index.wxml代码:

  1. <view class="t-content">
  2. <!-- swiper示例 -->
  3. <swiper wx:if="{{swiperList && swiperList.length>0}}" class="t-swiper" duration="{{duration}}" current="{{current}}" bindanimationfinish="itemChange">
  4. <swiper-item wx:for="{{swiperList}}" wx:for-item="item" wx:key="index" wx:for-index="index">
  5. <!-- 这里是你可以任意定义的内容哦,例如答题类、视频轮播类... //开始 -->
  6. <view class="t-item-con t-wh-100p" style="background-image: url({{item.bgImg}});">
  7. <view class="t-item-title">{{item.title}}</view>
  8. <text class="t-item-desc">{{item.desc}}</text>
  9. </view>
  10. <!-- 这里是你可以任意定义的内容哦,例如答题类、视频轮播类... //结束 -->
  11. </swiper-item>
  12. </swiper>
  13. <!-- 下面这个是为了演示快速跳转到某一个item -->
  14. <view class="t-leap-desc">
  15. 注:上面swiper中共10000个带图片的item,点击下方序号快速跳转:
  16. </view>
  17. <view class="t-leap">
  18. <view bindtap="leapTo" data-num="9">9</view>
  19. <view bindtap="leapTo" data-num="99">99</view>
  20. <view bindtap="leapTo" data-num="999">999</view>
  21. <view bindtap="leapTo" data-num="1999">1999</view>
  22. <view bindtap="leapTo" data-num="2999">2999</view>
  23. <view bindtap="leapTo" data-num="3999">3999</view>
  24. <view bindtap="leapTo" data-num="4999">4999</view>
  25. <view bindtap="leapTo" data-num="5999">5999</view>
  26. <view bindtap="leapTo" data-num="6999">6999</view>
  27. <view bindtap="leapTo" data-num="7999">7999</view>
  28. <view bindtap="leapTo" data-num="8999">8999</view>
  29. <view bindtap="leapTo" data-num="9999">9999</view>
  30. </view>
  31. </view>

 index.js代码:

  1. //这里引入封装的工具类方法,在插件包里有微信开发工具版工具类
  2. import { initSwiper, leapToItem, changeSwiperItem, defaultParams } from '../../common/kevy-enhanced-swiper-wx-1.0.js';
  3. //list -- swiper所有数据的存放列表
  4. //duration -- 初始化设置的过渡时间
  5. var { list, duration } = defaultParams;
  6. //测试图片背景,这块为了测试带图片且数据量大也不存在性能问题
  7. const bgImg = 'https://img-blog.csdnimg.cn/140a01b8ad3f46bb9b970fdd85433ebe.png';
  8. Page({
  9. /**
  10. * 页面的初始数据
  11. */
  12. data: {
  13. swiperList: [], //swiper实际列表,里面放的swiper-item数量为1-3个
  14. current: 0, //swiper实际列表(swiperList)中当前可以看到的那个swiper-item对应的下标,从0开始
  15. duration: duration, //swipper-item元素切换动画过渡时间
  16. currItemNo: 1,//当前显示的swiper-item在所有数据的存放列表(list)中的序号,例如总数量list里共10000条数据,currItemNo=150是指当前显示的是第150条数据
  17. },
  18. /**
  19. * 生命周期函数--监听页面加载
  20. */
  21. onLoad(options) {
  22. //这里去请求所有数据,如果接口是分页的就多请求几次拿到所有数据,不存在性能问题
  23. // uni.request({
  24. // ...请求逻辑
  25. // () => { list = res.data.list }
  26. // })
  27. //这里模拟请求到了所有数据,例如10000条,然后放到list数组里
  28. for (let i = 0; i < 10000; i++) {
  29. list.push({
  30. bgImg: bgImg,
  31. title: "[第" + (i + 1) + "个元素]我是一个无限制数量高性能的swiper",
  32. desc: "A. [第" + (i + 1) +
  33. "个元素]实现原理:\n\nB. swiper里永远最多只放3个元素,\n\nC. 在swiper切换时根据原来的下标计算新的需要显示的item对应下标,\n\nD. 然后组装好新的最多3个item数据渲染到页面"
  34. });
  35. }
  36. //请求到所有数据后放到list变量里后,初始化swiper
  37. initSwiper(this, list, () => {
  38. //这里是初始化完后的回调,你可以写自己的逻辑了,例如拿到当前swiper-item
  39. console.log(this.data.swiperList[this.data.current]);
  40. });
  41. },
  42. /**
  43. * swiper切换事件,这里监听的是切换完成动画事件
  44. */
  45. itemChange(e) {
  46. changeSwiperItem(this, Number(e.detail.current), list, duration, () => {
  47. //切换完成
  48. //这里可以写自己的逻辑啦,例如去判断当前item是否收藏...
  49. console.log("切换完成,当前显示的是===", this.data.swiperList[this.data.current].title)
  50. });
  51. },
  52. /**
  53. * 跳到第n个item数据,n为序号从1开始
  54. */
  55. leapTo(e) {
  56. leapToItem(this, Number(e.currentTarget.dataset.num), list, duration, () => {
  57. //这里是跳完之后,此时页面已经显示第n个item了,
  58. //你可以在这里写自己的逻辑了,例如判断当前item是否收藏,是否错题...
  59. console.log("已经跳转到第" + Number(e.currentTarget.dataset.num) + "个item啦");
  60. });
  61. }
  62. })

index.wxss代码:

  1. .t-content {
  2. background-color: #f7f7f7;
  3. min-height: 100vh;
  4. }
  5. .t-h-100p {
  6. height: 100%;
  7. }
  8. .t-hover{
  9. opacity: 0.7;
  10. }
  11. .t-w-100p {
  12. width: 100%;
  13. }
  14. .t-wh-100p {
  15. width: 100%;
  16. height: 100%;
  17. }
  18. .t-swiper {
  19. width: 100%;
  20. box-sizing: border-box;
  21. height: 500rpx;
  22. }
  23. .t-item-con {
  24. background-size: 100% 100%;
  25. background-repeat: no-repeat;
  26. display: flex;
  27. flex-direction: column;
  28. justify-content: flex-start;
  29. align-items: flex-start;
  30. padding: 30rpx;
  31. box-sizing: border-box;
  32. }
  33. .t-item-title {
  34. font-size: 36rpx;
  35. color: #ffffff;
  36. font-weight: bold;
  37. text-align: justify;
  38. }
  39. .t-item-desc {
  40. font-size: 28rpx;
  41. color: #ffffff;
  42. margin-top: 30rpx;
  43. text-align: justify;
  44. }
  45. .t-leap-desc {
  46. font-size: 28rpx;
  47. width: 690rpx;
  48. margin: 60rpx auto 0rpx;
  49. color: black;
  50. }
  51. .t-leap {
  52. width: 663rpx;
  53. height: 100rpx;
  54. margin: 0 auto;
  55. box-sizing: border-box;
  56. padding: 15rpx;
  57. display: flex;
  58. flex-direction: row;
  59. justify-content: flex-start;
  60. align-items: center;
  61. flex-wrap: wrap;
  62. }
  63. .t-leap view {
  64. font-size: 24rpx;
  65. color: #fff;
  66. padding: 15rpx;
  67. background: #42b983;
  68. border-radius: 10rpx;
  69. width: 57rpx;
  70. height: 30rpx;
  71. text-align: center;
  72. line-height: 30rpx;
  73. margin: 10rpx;
  74. }

 源码下载方式:dcloud插件市场搜索“微信小程序swiper无限数量不卡顿轮播图”。

或直接打开插件市场链接下载:https ://ext.dcloud.net.cn/plugin?id=12389

注:源码zip文件中包含uniapp版和微信开发者工具版对应的工具类和示例代码。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/293315
推荐阅读
相关标签
  

闽ICP备14008679号