Files
shoot-miniprograms/src/components/ScrollList.vue

98 lines
2.0 KiB
Vue
Raw Normal View History

2025-06-18 12:32:08 +08:00
<script setup>
2025-09-03 16:34:54 +08:00
import { ref } from "vue";
import { onShow } from "@dcloudio/uni-app";
2025-06-18 12:32:08 +08:00
const props = defineProps({
show: {
type: Boolean,
2025-07-01 00:25:17 +08:00
default: true,
2025-06-18 12:32:08 +08:00
},
onLoading: {
type: Function,
default: async (page) => [],
},
pageSize: {
type: Number,
default: 10,
},
});
2025-09-03 16:34:54 +08:00
const refreshing = ref(true);
2025-06-18 12:32:08 +08:00
const loading = ref(false);
const noMore = ref(false);
2025-09-03 16:34:54 +08:00
const count = ref(0);
2025-06-18 12:32:08 +08:00
const page = ref(1);
const refresherrefresh = async () => {
if (refreshing.value) return;
try {
refreshing.value = true;
page.value = 1;
2025-07-29 11:12:51 +08:00
const length = await props.onLoading(page.value);
2025-09-03 16:34:54 +08:00
count.value = length;
2025-07-29 11:12:51 +08:00
if (length < props.pageSize) noMore.value = true;
2025-06-18 12:32:08 +08:00
} finally {
refreshing.value = false;
}
};
const scrolltolower = async () => {
2025-07-29 11:12:51 +08:00
if (loading.value || noMore.value) return;
2025-06-18 12:32:08 +08:00
try {
loading.value = true;
page.value += 1;
2025-07-29 11:12:51 +08:00
const length = await props.onLoading(page.value);
2025-09-03 16:34:54 +08:00
count.value += length;
2025-07-29 11:12:51 +08:00
if (length < props.pageSize) noMore.value = true;
2025-06-18 12:32:08 +08:00
} finally {
loading.value = false;
}
};
2025-09-03 16:34:54 +08:00
onShow(async () => {
try {
const length = await props.onLoading(page.value);
count.value = length;
if (length < props.pageSize) noMore.value = true;
} finally {
refreshing.value = false;
2025-06-18 12:32:08 +08:00
}
2025-09-03 16:34:54 +08:00
});
2025-06-18 12:32:08 +08:00
</script>
<template>
<scroll-view
class="scroll-list"
scroll-y
2025-08-05 16:26:43 +08:00
:show-scrollbar="false"
enhanced="true"
:bounces="false"
2025-06-18 12:32:08 +08:00
refresher-default-style="white"
:refresher-enabled="true"
:refresher-triggered="refreshing"
@refresherrefresh="refresherrefresh"
@scrolltolower="scrolltolower"
:style="{
display: show ? 'flex' : 'none',
}"
>
<slot></slot>
2025-09-03 16:34:54 +08:00
<view class="tips">
<text v-if="loading">加载中...</text>
<text v-if="noMore">{{ count === 0 ? "暂无数据" : "没有更多了" }}</text>
</view>
2025-06-18 12:32:08 +08:00
</scroll-view>
</template>
<style scoped>
.scroll-list {
width: 100%;
height: 100%;
}
.tips {
2025-09-03 16:34:54 +08:00
height: 50rpx;
}
.tips > text {
color: #d0d0d0;
2025-06-18 12:32:08 +08:00
display: block;
text-align: center;
font-size: 12px;
margin: 10px;
}
</style>