背景
有个移动端的Vue项目,新的需求需要加上如下图这种左/右滑,加载前/后项的,毫无疑问swiper走起,vue-awesome-swiper。
实践
异步获取数据:
<template>
<swiper :options="swiperOption">
<swiper-slide v-for="(slide, index) in swiperSlides" :key="index">I'm Slide {{ slide }}</swiper-slide>
<div class="swiper-pagination" slot="pagination"></div>
</swiper>
</template>
<script>
import { swiper, swiperSlide } from 'vue-awesome-swiper'
import 'swiper/dist/css/swiper.css'
export default {
name: 'carrousel',
components: {
swiper,
swiperSlide
},
data() {
return {
swiperOption: {
effect: "coverflow",
grabCursor: true,
centeredSlides: true,
slidesPerView: "auto", // virtual时不能为"auto"
observer: true,
observeParents: true,
coverflowEffect: {
rotate: 0,
stretch: -20,
depth: 70,
slideShadows: false
}
},
swiperSlides: [1, 2, 3, 4, 5]
}
},
mounted() {
setInterval(() => {
console.log('simulate async data')
if (this.swiperSlides.length < 10) {
this.swiperSlides.push(this.swiperSlides.length + 1)
}
}, 3000)
}
}
</script>
但是列表数据比较多,不可能全部渲染呀,怎么办呢?
虚拟列表你值得拥有~查了下swiper的文档,virtual属性支持虚拟列表,perfect!
<div class="swiper-container">
<div class="swiper-wrapper"></div>
</div>
<script>
var mySwiper = new Swiper('.swiper-container', {
virtual: {
slides: (function () {
var slides = [];
for (var i = 0; i < 600; i += 1) {
slides.push('Slide ' + (i + 1));
}
return slides;
}()),
},
//或者 virtual: true,
});
</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 andslidesPerView: 'auto'
virtual 和 slidesPerView: ‘auto’ 不能一起使用,那怎样让页面中出现前后slide的一部分呢?
英文文档中 slidesPerView取值Number or “auto”,最开始没想到可取小数(&%¥#),参考 slidesPerView,可以设置为数字(可为*小数,小数不可loop),或者 ‘auto’则自动根据slides的宽度来设定数量。
中英文文档混着看的我。。
上面的例子里异步数据怎么处理呢?
可以参考我下面的例子,例子中还有点疑问,知道的可以帮忙解决下哦~