SimplePageContentLoader.vue 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <template>
  2. <div
  3. v-if="loader?.loadStatus.value == 'loading'"
  4. style="min-height: 200rpx;display: flex;justify-content: center;align-items: center;"
  5. >
  6. <a-spin tip="加载中" />
  7. </div>
  8. <div
  9. v-else-if="loader?.loadStatus.value == 'error'"
  10. style="min-height: 200rpx"
  11. >
  12. <a-empty :description="loader.loadError.value" >
  13. <a-button @click="handleRetry">重试</a-button>
  14. </a-empty>
  15. </div>
  16. <template v-else-if="loader?.loadStatus.value == 'finished' || loader?.loadStatus.value == 'nomore'">
  17. <slot />
  18. </template>
  19. <div
  20. v-if="showEmpty || loader?.loadStatus.value == 'nomore'"
  21. style="min-height: 200rpx"
  22. class="empty"
  23. >
  24. <a-empty :description="emptyView?.text ?? '暂无数据'">
  25. <a-button
  26. v-if="emptyView?.button"
  27. @click="emptyView?.buttonClick ?? handleRetry"
  28. >
  29. {{emptyView?.buttonText ?? '刷新'}}
  30. </a-button>
  31. </a-empty>
  32. </div>
  33. </template>
  34. <script setup lang="ts">
  35. import type { ILoaderCommon } from '@/composeable/LoaderCommon';
  36. import { onMounted, ref, type PropType } from 'vue';
  37. const props = defineProps({
  38. loader: {
  39. type: Object as PropType<ILoaderCommon<any>>,
  40. default: null,
  41. },
  42. autoLoad: {
  43. type: Boolean,
  44. default: false,
  45. },
  46. showEmpty: {
  47. type: Boolean,
  48. default: false,
  49. },
  50. emptyView: {
  51. type: Object as PropType<{
  52. text: string,
  53. buttonText: string,
  54. button: boolean,
  55. buttonClick: () => void,
  56. }>,
  57. default: null,
  58. },
  59. })
  60. const loaded = ref(false);
  61. onMounted(() => {
  62. loaded.value = false;
  63. if (props.autoLoad)
  64. handleLoad();
  65. });
  66. function handleRetry() {
  67. props.loader.loadData(undefined);
  68. }
  69. function handleLoad() {
  70. if (loaded.value)
  71. return;
  72. loaded.value = true;
  73. props.loader.loadData(undefined);
  74. }
  75. </script>