index.vue 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <script lang="ts" setup>
  2. defineProps({
  3. header: {
  4. type: String,
  5. default: '',
  6. },
  7. bodyStyle: {
  8. type: Object,
  9. default: () => {
  10. return {}
  11. },
  12. },
  13. shadow: {
  14. type: String,
  15. default: '',
  16. },
  17. skeleton: {
  18. type: Boolean,
  19. default: false,
  20. },
  21. skeletonRows: {
  22. type: Number,
  23. default: 4, //显示的数量会比传入的数量多 1
  24. },
  25. })
  26. let timer: any = null
  27. const skeletonShow = ref(true)
  28. timer = setTimeout(() => {
  29. skeletonShow.value = false
  30. }, 500)
  31. onBeforeRouteLeave((to, from, next) => {
  32. clearInterval(timer)
  33. next()
  34. })
  35. </script>
  36. <template>
  37. <el-card :body-style="bodyStyle" class="vab-card" :shadow="shadow">
  38. <template v-if="$slots.header || header" #header>
  39. <slot name="header">{{ header }}</slot>
  40. </template>
  41. <el-skeleton
  42. v-if="skeleton"
  43. animated
  44. :loading="skeletonShow"
  45. :rows="skeletonRows"
  46. >
  47. <template #default>
  48. <slot class="vab-card-transition" />
  49. </template>
  50. </el-skeleton>
  51. <slot v-else class="vab-card-transition" />
  52. </el-card>
  53. </template>
  54. <style lang="scss" scoped>
  55. .vab-card {
  56. &-transition {
  57. transition: $base-transition;
  58. }
  59. }
  60. </style>