cwg-load-more-wrapper.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <template>
  2. <scroll-view scroll-y :lower-threshold="lowerThreshold" :refresher-enabled="refresherEnabled"
  3. :refresher-triggered="refresherTriggered" @refresherrefresh="onRefresherRefresh"
  4. @refresherrestore="onRefresherRestore" :style="{ height: `calc(100vh - ${statusBarHeight + height + 60}px)` }"
  5. @scrolltolower="emitReachBottom" class="loadmore-wrapper">
  6. <slot></slot>
  7. <view class="loading" v-if="loading">{{ t('common.loading') }}</view>
  8. <view class="finished" v-if="finished">{{ t('News.NoMore') }}</view>
  9. </scroll-view>
  10. </template>
  11. <script setup>
  12. import { computed, defineEmits, defineProps, ref } from 'vue'
  13. import useGlobalStore from '@/stores/use-global-store'
  14. import { useI18n } from 'vue-i18n';
  15. const { t } = useI18n();
  16. const globalStore = useGlobalStore()
  17. const statusBarHeight = computed(() => globalStore.statusBarHeight);
  18. const props = defineProps({
  19. lowerThreshold: { type: Number, default: 200 },
  20. loading: { type: Boolean, default: false },
  21. finished: { type: Boolean, default: false },
  22. refresherEnabled: { type: Boolean, default: false },
  23. isScroll: { type: Boolean, default: true },
  24. height: { type: Number, default: 0 },
  25. })
  26. const emit = defineEmits(['reach-bottom', 'refresh'])
  27. const refresherTriggered = ref(false)
  28. const emitReachBottom = () => {
  29. emit('reach-bottom')
  30. }
  31. const onRefresherRefresh = () => {
  32. refresherTriggered.value = true
  33. emit('refresh')
  34. }
  35. const onRefresherRestore = () => {
  36. refresherTriggered.value = false
  37. }
  38. defineExpose({
  39. stopRefresh: () => {
  40. refresherTriggered.value = false
  41. }
  42. })
  43. </script>
  44. <style scoped lang="scss">
  45. @import "@/uni.scss";
  46. .loadmore-wrapper {
  47. /* height: calc(100vh - var(--status-bar-height)); */
  48. width: 100%;
  49. box-sizing: border-box;
  50. }
  51. .loading,
  52. .finished {
  53. text-align: center;
  54. padding: px2rpx(20);
  55. color: #888;
  56. }
  57. </style>