cwg-load-more-wrapper.vue 1.9 KB

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