使用swiper时如果item太多会很卡,所以通常只加载小部分数据,待用户前后划到头时再加载更多。
一般是向前滑到头(current为0)时,加载更多的前置item使可以继续向前。(向后划类似)
添加前置item同时要减小current以保持当前显示项不变,但直接setData会导致界面闪烁。
(加载后置的item不会闪烁;但,若删除前置的item也会闪烁,处理方法类似)
避免闪烁的思路是要在animationfinish事件结束后才处理。而且要先把duration置零,处理完之后再复位。
uni-app代码示例如下:
<template>
...
<swiper: current="current" :duration="duration" @change="showChange" @animationfinish="showFinish">
<swiper-item v-for="(item,index) in items" :key="item.id">
<view>{{item.content}}</view>
</swiper-item>
</swiper>
...
</template>
<script>
export default {
data() {
return {
items: [],
current: 0,
duration: 500,
}
},
methods: {
showChange(e){
this.current = e.detail.current
},
showFinish(e){
if (this.current < 1){//前面没了
let item = getLeftItem()//尝试获取前一个item
if (item){
setTimeout(() => {
this.duration = 0
this.items.unshift(item);
this.current = 1
this.duration = 500
}, 1)
}
}
},
},
}
</script>