cwg-page-more-wrapper.vue 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. class="loadmore-wrapper">
  11. <slot></slot>
  12. <view class="loading" v-if="loading">{{ t('common.loading') }}</view>
  13. </scroll-view>
  14. </template>
  15. <script setup>
  16. import { computed, defineEmits, defineProps, ref } from 'vue'
  17. import useGlobalStore from '@/stores/use-global-store'
  18. import { useI18n } from 'vue-i18n';
  19. const { t } = useI18n();
  20. const globalStore = useGlobalStore()
  21. const statusBarHeight = computed(() => globalStore.statusBarHeight);
  22. const props = defineProps({
  23. lowerThreshold: { type: Number, default: 200 },
  24. loading: { type: Boolean, default: false },
  25. refresherEnabled: { type: Boolean, default: false },
  26. isScroll: { type: Boolean, default: true },
  27. height: { type: Number, default: 0 },
  28. })
  29. const emit = defineEmits(['reach-bottom', 'refresh'])
  30. const refresherTriggered = ref(false)
  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. text-align: center;
  53. padding: px2rpx(20);
  54. color: #888;
  55. }
  56. </style>