Blame view

node_modules/element-ui/packages/skeleton/src/index.vue 1.59 KB
7820380e   “wangming”   1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  <template>
    <div>
      <template v-if="uiLoading">
        <div :class="['el-skeleton', animated ? 'is-animated' : '', ]" v-bind="$attrs">
          <template v-for="i in count">
            <slot v-if="loading" name="template">
              <el-skeleton-item
                v-for="item in rows"
                :key="`${i}-${item}`"
                :class="{
                  'el-skeleton__paragraph': item !== 1,
                  'is-first': item === 1,
                  'is-last': item === rows && rows > 1,
                }"
                variant="p"
              />
            </slot>
          </template>
        </div>
      </template>
      <template v-else>
        <slot v-bind="$attrs"></slot>
      </template>
    </div>
  </template>
  <script>
  export default {
    name: 'ElSkeleton',
    props: {
      animated: {
        type: Boolean,
        default: false
      },
      count: {
        type: Number,
        default: 1
      },
      rows: {
        type: Number,
        default: 4
      },
      loading: {
        type: Boolean,
        default: true
      },
      throttle: {
        type: Number,
        default: 0
      }
    },
    watch: {
      loading: {
        handler(loading) {
          if (this.throttle <= 0) {
            this.uiLoading = loading;
            return;
          }
          if (loading) {
            clearTimeout(this.timeoutHandle);
            this.timeoutHandle = setTimeout(() => {
              this.uiLoading = this.loading;
            }, this.throttle);
          } else {
            this.uiLoading = loading;
          }
        },
        immediate: true
      }
    },
    data() {
      return {
        uiLoading: this.throttle <= 0 ? this.loading : false
      };
    }
  };
  </script>