骨架装载机组件

时间:2020-08-22 10:05:01

标签: javascript vue.js

我是VueJS的新手,我来找你看看我所做的事情是否可行。

在加载组件时,与其显示旧数据,不如显示一个预加载器。 我喜欢骨架加载器的想法,而不是简单的微调器。

现在我在商店中有一个状态,默认情况下为null,我有一个设置加载的变量和一个吸气剂。 为了避免出现视觉错误,我在路由器中使用beforeEach将加载状态初始化为true,以便默认情况下组件开始加载!

然后,在我看来,我将导入Loader组件及其svg和样式。 然后将其放在需要显示的组件上,并带有简单条件v-if =“!getLoading”和v-if =“ getLoading”。

问题是我感觉自己正在瞎摸,在说教,并在一定条件下展示这个组件?

如果有人可以给我一些建议或批准这种方法,我会放心的!

这是一个简单的Loader组件的代码

<template>
    <content-loader
        :height="78"
        :width="390"
        :speed="4"
        primaryColor="#f2f6fe"
        secondaryColor="#e0eafa"
    >
        <rect x="9" y="20" rx="4" ry="4" width="142" height="13" />
        <rect x="316.38" y="5.38" rx="5" ry="5" width="68" height="68" />
        <rect x="9" y="46" rx="4" ry="4" width="75.26" height="13.26" />
    </content-loader>
</template>

<script>
import { ContentLoader } from "vue-content-loader"

export default {
    components: {
        ContentLoader
    }
}
</script>

商店代码

const state = {
    loading: null,
}

const mutations = {
    SET_LOADING: (state, payload) => {
        state.loading = payload;
    },
}

const getters = {
    getLoading(state) {
        return state.loading;
    }
}

我认为利用率的示例:有条件

<div class="col-12 col-lg-4 col-xl-3 col-md-6" v-if="getLoading"> // the condition
                        <div class="card animate-up-2">
                            <div class="card-body">
                            // the component
                                <StatsLoader></StatsLoader>
                            </div>
                        </div>
                    </div>
                    <div class="col-12 col-lg-4 col-xl-3 col-md-6" v-if="!getLoading"> // the condition
                        <div class="card animate-up-2">
                            <div class="card-body">
                                <div class="d-flex align-items-center justify-content-between">
                                    <div>
                                        <h3 class="font-weight-bold text-uppercase">5 %</h3>
                                        <div class="d-flex d-sm-block d-lg-flex align-items-end">
                                            <p class="mb-0 mr-2 text-muted">API usage</p>
                                        </div>
                                    </div>
                                    <div>
                                        <div class="avatar avatar-lg">
                                            <div class="avatar-title sred sbg-soft-red rounded">
                                                <i class="fad fa-project-diagram"></i>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>

1 个答案:

答案 0 :(得分:0)

如果这是在所有路径上使用的全局加载器,则可以将其包装在组件中,并在任何地方使用该组件。使用named slots管理您的模板。 加载程序组件的示例:

Loader.vue

<template>
   <div>
     <slot name='loading' v-if='getLoading'>
        <StatsLoader></StatsLoader>
     </slot>
     <slot name='content v-if='!getLoading'></slot>
   </div>
</template>
<script>
  import StatsLoader from '@/components/StatsLoader.vue';
  export default {
    name: 'Loader',
    props: {
      isLoading: {
        type: Boolean,
        default: null
      }
    },
    computed: {
      getLoading() {
        return this.isLoading === null ? this.$store.state.loading : this.isLoading;
      }
    },
    components: {
      StatsLoader
    }
  }
</script>

此外,在全球范围内注册此组件将很有用,因此您无需包括所有路由。您可以在主条目文件中使用Vue.component进行此操作。

import Loader from '@/components/Loader.vue';

Vue.component('Loader', Loader);

您可以像这样重写当前的组件模板:

<Loader>
  <template v-slot:loader>
    <!-- Use a different loader here for this page maybe -->
  </template>
  <template v-slot:content>
    <div class="card animate-up-2">
      <div class="card-body">
         <div class="d-flex align-items-center justify-content-between">
            <div>
               <h3 class="font-weight-bold text-uppercase">5 %</h3>
               <div class="d-flex d-sm-block d-lg-flex align-items-end">
                  <p class="mb-0 mr-2 text-muted">API usage</p>
               </div>
            </div>
            <div>
               <div class="avatar avatar-lg">
                  <div class="avatar-title sred sbg-soft-red rounded">
                     <i class="fad fa-project-diagram"></i>
                  </div>
               </div>
            </div>
         </div>
      </div>
   </div>
  </template>
</Loader>

如果您不想依赖全局加载器,也可以使用<Loader :is-loading='isPageLoading' />

相关问题