当前位置:   article > 正文

swiper模仿下滑无限轮播_uniappswiper无限滑动加载

uniappswiper无限滑动加载

效果图,添加:vertical="true"属性便可往下无限滑

技术栈:vue2、uniapp、微信小程序

解决了什么:无限渲染dom节点只挂载三个dom元素

代码块

  1. <template>
  2. <view class="content">
  3. <view class="title">{{originIndex +1 }}/{{ originList.length }}</view>
  4. <swiper class="swiper" :circular="circularCom" :current="displayIndex" :vertical="true" @change="swiperChange"
  5. swiperDuration="250">
  6. <swiper-item v-for="(item, index) in displaySwiperList" :key="index">
  7. <view class="wrap_content">{{ item }} </view>
  8. </swiper-item>
  9. </swiper>
  10. </view>
  11. </template>
  12. <script>
  13. export default {
  14. data() {
  15. return {
  16. originList: [], // 源数据
  17. displaySwiperList: [], // swiper需要的数据
  18. displayIndex: 0, // 用于显示swiper的真正的下标数值只有:0,1,2。
  19. originIndex: 0, // 记录源数据的下标
  20. };
  21. },
  22. computed: {
  23. circularCom() {
  24. // 第一条数据时,关闭无限轮询
  25. return this.originIndex === 0 ? false : true
  26. // return false
  27. }
  28. },
  29. methods: {
  30. /**
  31. * 初始一个显示的swiper数据
  32. * @originIndex 从源数据的哪个开始显示默认0,如从其他页面跳转进来,要显示第n个,这个参数就是他的下标
  33. */
  34. initSwiperData(originIndex = this.originIndex) {
  35. const originListLength = this.originList.length; // 源数据长度
  36. const displayIndex = this.displayIndex
  37. const displayList = [];
  38. const isFirstDisplayIndex = displayIndex == 0 // swiper滑块在第一个0,1,2
  39. const isLastDisplayIndex = displayIndex == 2 // swiper滑块在最后一个0,1,2
  40. const isFristOriginIndex = originIndex == 0 // 第一条数据源下标
  41. const isLastOriginIndex = originIndex == originListLength - 1 // 最后一条数据源下标
  42. const displayIndexNearUp = isFirstDisplayIndex ? 2 : displayIndex - 1 // 向上swiper滑块下标
  43. const displayIndexNearDown = isLastDisplayIndex ? 0 : displayIndex + 1 // 向下swiper滑块下标
  44. const originIndexNearUp = isFristOriginIndex ? originListLength - 1 : originIndex - 1 // 向上滑的数据源下标
  45. const originIndexNearDown = isLastOriginIndex ? 0 : originIndex + 1 // 向下滑的数据源下标
  46. displayList[displayIndex] = this.originList[originIndex];
  47. displayList[displayIndexNearUp] = this.originList[originIndexNearUp]
  48. displayList[displayIndexNearDown] = this.originList[originIndexNearDown]
  49. this.displaySwiperList = displayList;
  50. },
  51. /**
  52. * swiper滑动时候
  53. */
  54. swiperChange(event) {
  55. const {
  56. current
  57. } = event.detail;
  58. const originListLength = this.originList.length; // 源数据长度
  59. const hasLastOriginIndex = this.originIndex == originListLength - 1 // 最后一条数据
  60. const hasFirstOriginIndex = this.originIndex == 0 // 第一条数据
  61. if ([-1, 2].includes(this.displayIndex - current)) {
  62. /**
  63. * =============向后/向下滑动=============
  64. * 0(displayIndex)滑到1(current): -1
  65. * 1(displayIndex)滑到2(current): -1
  66. * 2(displayIndex)滑到0(current): 2
  67. * */
  68. this.originIndex = hasLastOriginIndex ? 0 : this.originIndex + 1;
  69. } else if ([-2, 1].includes(this.displayIndex - current)) {
  70. /**
  71. * =============向前/向上滑动=============
  72. * 0(displayIndex)滑到2(current): -2
  73. * 2(displayIndex)滑到1(current): 1
  74. * 1(displayIndex)滑到0(current): 1
  75. * */
  76. this.originIndex = hasFirstOriginIndex ? originListLength - 1 : this.originIndex - 1;
  77. }
  78. this.displayIndex = current // 必须写在这,不能写在上面
  79. this.initSwiperData();
  80. },
  81. },
  82. created() {
  83. const tempList = []
  84. for (let i = 1; i <= 11; i++) {
  85. tempList.push(i);
  86. }
  87. if (tempList.length % 3 == 1) {
  88. const staticArr = [110, 120]
  89. tempList.push(...staticArr)
  90. } else if (tempList.length % 3 == 2) {
  91. const staticArr = [119]
  92. tempList.push(...staticArr)
  93. }
  94. this.originList = tempList
  95. this.initSwiperData();
  96. },
  97. };
  98. </script>
  99. <style>
  100. .title {
  101. width: 100%;
  102. display: flex;
  103. justify-content: center;
  104. align-items: center;
  105. height: 100rpx;
  106. }
  107. .swiper {
  108. height: calc(100vh - 100rpx);
  109. }
  110. .wrap_content {
  111. border-radius: 20rpx;
  112. display: flex;
  113. justify-content: center;
  114. align-items: center;
  115. background: gray;
  116. height: 100vh;
  117. color: green;
  118. font-size: 80px;
  119. margin: 0rpx 40rpx;
  120. }
  121. </style>

注意缺陷,一定要看

  1. 由于swiper自身的问题,动态设置circular无限轮询属性时 :circular="false",切换会丢失动画。这是swiper的一个缺陷,官方也知道但是一直没有修复。从1切换到2就能感受到,这是个用户体验的问题,参考网友踩坑记录https://developers.weixin.qq.com/community/develop/doc/000a2a8b4889484e31a61630653c00

  1. 数据长度必须是3的倍数,如果数据不够手动添加,我们可以添加静态数据比如一张图片或者背景div

  1. 只能在微信小程序端、H5页面运行,在客户端(安卓、IOS)十之八九是行不通

最后

在代码块里面都有些非常多注释,如果有疑惑,使用console.log挨个把变量值打印出来,应该马上就能理解。

这只是deom实例,swiper-item标签里面可以直接放video标签。demo主要解决问题是渲染dom元素,如果渲染所有数据,当数据达到100条左右就该头疼了。

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

闽ICP备14008679号