123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <!-- 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>
|