我是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>
答案 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' />
。