144 lines
4.0 KiB
Vue
144 lines
4.0 KiB
Vue
|
<!-- z-paging -->
|
|||
|
<!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->
|
|||
|
<!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->
|
|||
|
<!-- 反馈QQ群:790460711 -->
|
|||
|
|
|||
|
<!-- 滑动切换选项卡swiper-item,此组件支持easycom规范,可以在项目中直接引用 -->
|
|||
|
<template>
|
|||
|
<view class="zp-swiper-item-container">
|
|||
|
<z-paging ref="paging" :fixed="false"
|
|||
|
:auto="false" :useVirtualList="useVirtualList" :useInnerList="useInnerList" :cellKeyName="cellKeyName" :innerListStyle="innerListStyle"
|
|||
|
:preloadPage="preloadPage" :cellHeightMode="cellHeightMode" :virtualScrollFps="virtualScrollFps" :virtualListCol="virtualListCol"
|
|||
|
@query="_queryList" @listChange="_updateList">
|
|||
|
<slot />
|
|||
|
<template #header>
|
|||
|
<slot name="header"/>
|
|||
|
</template>
|
|||
|
<template #cell="{item,index}">
|
|||
|
<slot name="cell" :item="item" :index="index"/>
|
|||
|
</template>
|
|||
|
<template #footer>
|
|||
|
<slot name="footer"/>
|
|||
|
</template>
|
|||
|
</z-paging>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import zPaging from '../z-paging/z-paging'
|
|||
|
export default {
|
|||
|
name: "z-paging-swiper-item",
|
|||
|
components: { zPaging },
|
|||
|
data() {
|
|||
|
return {
|
|||
|
firstLoaded: false
|
|||
|
}
|
|||
|
},
|
|||
|
props: {
|
|||
|
// 当前组件的index,也就是当前组件是swiper中的第几个
|
|||
|
tabIndex: {
|
|||
|
type: Number,
|
|||
|
default: function() {
|
|||
|
return 0
|
|||
|
}
|
|||
|
},
|
|||
|
// 当前swiper切换到第几个index
|
|||
|
currentIndex: {
|
|||
|
type: Number,
|
|||
|
default: function() {
|
|||
|
return 0
|
|||
|
}
|
|||
|
},
|
|||
|
// 是否使用虚拟列表,默认为否
|
|||
|
useVirtualList: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
// 是否在z-paging内部循环渲染列表(内置列表),默认为否。若use-virtual-list为true,则此项恒为true
|
|||
|
useInnerList: {
|
|||
|
type: Boolean,
|
|||
|
default: false
|
|||
|
},
|
|||
|
// 内置列表cell的key名称,仅nvue有效,在nvue中开启use-inner-list时必须填此项
|
|||
|
cellKeyName: {
|
|||
|
type: String,
|
|||
|
default: ''
|
|||
|
},
|
|||
|
// innerList样式
|
|||
|
innerListStyle: {
|
|||
|
type: Object,
|
|||
|
default: function() {
|
|||
|
return {};
|
|||
|
}
|
|||
|
},
|
|||
|
// 预加载的列表可视范围(列表高度)页数,默认为12,即预加载当前页及上下各12页的cell。此数值越大,则虚拟列表中加载的dom越多,内存消耗越大(会维持在一个稳定值),但增加预加载页面数量可缓解快速滚动短暂白屏问题
|
|||
|
preloadPage: {
|
|||
|
type: [Number, String],
|
|||
|
default: 12
|
|||
|
},
|
|||
|
// 虚拟列表cell高度模式,默认为fixed,也就是每个cell高度完全相同,将以第一个cell高度为准进行计算。可选值【dynamic】,即代表高度是动态非固定的,【dynamic】性能低于【fixed】。
|
|||
|
cellHeightMode: {
|
|||
|
type: String,
|
|||
|
default: 'fixed'
|
|||
|
},
|
|||
|
// 虚拟列表列数,默认为1。常用于每行有多列的情况,例如每行有2列数据,需要将此值设置为2
|
|||
|
virtualListCol: {
|
|||
|
type: [Number, String],
|
|||
|
default: 1
|
|||
|
},
|
|||
|
// 虚拟列表scroll取样帧率,默认为60,过高可能出现卡顿等问题
|
|||
|
virtualScrollFps: {
|
|||
|
type: [Number, String],
|
|||
|
default: 60
|
|||
|
},
|
|||
|
},
|
|||
|
watch: {
|
|||
|
currentIndex: {
|
|||
|
handler(newVal, oldVal) {
|
|||
|
if (newVal === this.tabIndex) {
|
|||
|
// 懒加载,当滑动到当前的item时,才去加载
|
|||
|
if (!this.firstLoaded) {
|
|||
|
this.$nextTick(()=>{
|
|||
|
let delay = 5;
|
|||
|
// #ifdef MP-TOUTIAO
|
|||
|
delay = 100;
|
|||
|
// #endif
|
|||
|
setTimeout(() => {
|
|||
|
this.$refs.paging.reload().catch(() => {});
|
|||
|
}, delay);
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
immediate: true
|
|||
|
}
|
|||
|
},
|
|||
|
methods: {
|
|||
|
reload(data) {
|
|||
|
return this.$refs.paging.reload(data);
|
|||
|
},
|
|||
|
complete(data) {
|
|||
|
this.firstLoaded = true;
|
|||
|
return this.$refs.paging.complete(data);
|
|||
|
},
|
|||
|
_queryList(pageNo, pageSize, from) {
|
|||
|
this.$emit('query', pageNo, pageSize, from);
|
|||
|
},
|
|||
|
_updateList(list) {
|
|||
|
this.$emit('updateList', list);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style scoped>
|
|||
|
.zp-swiper-item-container {
|
|||
|
/* #ifndef APP-NVUE */
|
|||
|
height: 100%;
|
|||
|
/* #endif */
|
|||
|
/* #ifdef APP-NVUE */
|
|||
|
flex: 1;
|
|||
|
/* #endif */
|
|||
|
}
|
|||
|
</style>
|