背景

有个移动端的Vue项目,新的需求需要加上如下图这种左/右滑,加载前/后项的,毫无疑问swiper走起,vue-awesome-swiper

轮播.png

实践

异步获取数据:

  1. <template>
  2. <swiper :options="swiperOption">
  3. <swiper-slide v-for="(slide, index) in swiperSlides" :key="index">I'm Slide {{ slide }}</swiper-slide>
  4. <div class="swiper-pagination" slot="pagination"></div>
  5. </swiper>
  6. </template>
  7. <script>
  8. import { swiper, swiperSlide } from 'vue-awesome-swiper'
  9. import 'swiper/dist/css/swiper.css'
  10. export default {
  11. name: 'carrousel',
  12. components: {
  13. swiper,
  14. swiperSlide
  15. },
  16. data() {
  17. return {
  18. swiperOption: {
  19. effect: "coverflow",
  20. grabCursor: true,
  21. centeredSlides: true,
  22. slidesPerView: "auto", // virtual时不能为"auto"
  23. observer: true,
  24. observeParents: true,
  25. coverflowEffect: {
  26. rotate: 0,
  27. stretch: -20,
  28. depth: 70,
  29. slideShadows: false
  30. }
  31. },
  32. swiperSlides: [1, 2, 3, 4, 5]
  33. }
  34. },
  35. mounted() {
  36. setInterval(() => {
  37. console.log('simulate async data')
  38. if (this.swiperSlides.length < 10) {
  39. this.swiperSlides.push(this.swiperSlides.length + 1)
  40. }
  41. }, 3000)
  42. }
  43. }
  44. </script>

但是列表数据比较多,不可能全部渲染呀,怎么办呢?
虚拟列表你值得拥有~查了下swiper的文档,virtual属性支持虚拟列表,perfect!

  1. <div class="swiper-container">
  2. <div class="swiper-wrapper"></div>
  3. </div>
  4. <script>
  5. var mySwiper = new Swiper('.swiper-container', {
  6. virtual: {
  7. slides: (function () {
  8. var slides = [];
  9. for (var i = 0; i < 600; i += 1) {
  10. slides.push('Slide ' + (i + 1));
  11. }
  12. return slides;
  13. }()),
  14. },
  15. //或者 virtual: true,
  16. });
  17. </script>

等等,上面这段virtual属性的代码是swiper的,vue上咋使用呢?
vue-awesome-swiper issues上查查。
swiper英文文档上有提供例子(React也有),自行参考:https://swiperjs.com/api/#virtual

Note that according to Virtual Slides realization it doesn’t work with loop mode, slidesPerColumn more than 1 and slidesPerView: 'auto'

virtual slidesPerView: ‘auto’ 不能一起使用,那怎样让页面中出现前后slide的一部分呢?
英文文档中 slidesPerView取值Number or “auto”,最开始没想到可取小数(&%¥#),参考 slidesPerView,可以设置为数字(可为*小数,小数不可loop),或者 ‘auto’则自动根据slides的宽度来设定数量。
中英文文档混着看的我。。

上面的例子里异步数据怎么处理呢?
可以参考我下面的例子,例子中还有点疑问,知道的可以帮忙解决下哦~

Vue+Swiper虚拟列表 - 图3