skeleton-component-modal.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import {
  2. Cell,
  3. CellGroup,
  4. Skeleton,
  5. SkeletonImage,
  6. SkeletonParagraph
  7. } from 'vant';
  8. import { defineComponent, onMounted, reactive, watch } from 'vue';
  9. import styles from './component.module.less';
  10. export default defineComponent({
  11. name: 'skeleton-modal',
  12. props: {
  13. show: {
  14. type: Boolean,
  15. default: false
  16. },
  17. showCount: {
  18. type: Array,
  19. default: () => [1, 2, 3, 4, 5]
  20. }
  21. },
  22. setup(props, { slots }) {
  23. const forms = reactive({
  24. loading: false
  25. });
  26. onMounted(() => {
  27. forms.loading = props.show;
  28. });
  29. watch(
  30. () => props.show,
  31. () => {
  32. forms.loading = props.show;
  33. }
  34. );
  35. return () => (
  36. <Skeleton loading={forms.loading} style="flex-wrap: wrap">
  37. {{
  38. template: () => (
  39. <div
  40. style={{
  41. height: `calc(100vh - var(--header-height))`,
  42. overflow: 'hidden',
  43. width: '100%'
  44. }}>
  45. {props.showCount.map(() => (
  46. <Cell center>
  47. {{
  48. icon: () => (
  49. <div class={styles.iconGroup}>
  50. <SkeletonImage class={styles.iconStudent} />
  51. </div>
  52. ),
  53. title: () => (
  54. <div class={styles.userInfo}>
  55. <SkeletonParagraph
  56. class={styles.name}
  57. rowWidth={'60%'}
  58. />
  59. <SkeletonParagraph rowWidth={'40%'} />
  60. </div>
  61. ),
  62. value: () => (
  63. <div class={styles.after} style={{ width: '80px' }}>
  64. <SkeletonParagraph rowWidth={'100%'} />
  65. </div>
  66. )
  67. }}
  68. </Cell>
  69. ))}
  70. </div>
  71. ),
  72. default: () => slots.default && slots.default()
  73. }}
  74. </Skeleton>
  75. );
  76. }
  77. });