我正在寻找一种可重用的方法来显示全页加载器(侧边栏始终可见,但加载器应覆盖页面内容部分),直到完成所有必要的api获取。
我有一个父组件LaunchDetails
包装在PageLoader
组件中。
LaunchDetails.vue
<template>
<PageLoader>
<router-link :to="{ name: 'launches' }"> Back to launches </router-link>
<h1>{{ name }}</h1>
<section>
<TabMenu :links="menuLinks" />
</section>
<section>
<router-view />
</section>
</PageLoader>
</template>
<script>
import TabMenu from "@/components/general/TabMenu";
export default {
data() {
return {
menuLinks: [
{ to: { name: "launchOverview" }, display_name: "Overview" },
{ to: { name: "launchRocket" }, display_name: "Rocket" },
],
};
},
components: {
TabMenu,
},
created() {
this.$store.dispatch("launches/fetchLaunch", this.$route.params.launch_id);
},
computed: {
name() {
return this.$store.getters["launches/name"];
},
},
};
</script>
PageLoader.vue
<template>
<Spinner v-if="isLoading" full size="medium" />
<slot v-else></slot>
</template>
<script>
import Spinner from "@/components/general/Spinner.vue";
export default {
components: {
Spinner,
},
computed: {
isLoading() {
return this.$store.getters["loader/isLoading"];
},
},
};
</script>
LaunchDetails
模板中有另一个路由视图,在这些子页面中,根据 LaunchDetails
请求的数据进行新的获取请求。
RocketDetails.vue
<template>
<PageLoader>
<h2>Launch rocket details</h2>
<RocketCard v-if="rocket" :rocket="rocket" />
</PageLoader>
</template>
<script>
import LaunchService from "@/services/LaunchService";
import RocketCard from "@/components/rocket/RocketCard.vue";
export default {
components: {
RocketCard,
},
mounted() {
this.loadRocket();
},
data() {
return {
rocket: null,
};
},
methods: {
async loadRocket() {
const rocket_id = this.$store.getters["launches/getRocketId"];
if (rocket_id) {
const response = await LaunchService.getRocket(rocket_id);
this.rocket = response.data;
}
},
},
};
</script>
我需要的是一种在父组件(
LaunchDetails
)中提取数据的方法。如果这些数据存储在vuex store中,子组件(LaunchRocket
)将获取必要的store数据并执行提取请求。在此期间,我想要全屏加载器或者在父组件加载时显示全屏加载器,以及包含嵌套画布的加载器。此时,vuex store正在跟踪一个由axios拦截器处理的
isLoading
属性。所有代码都可以在此沙箱中查看。
(注意:在此示例中,我可以从URL中获取
rocket_id
,但在我的项目中不是这样,所以我真的正在寻找一种从vuex store中获取这些数据的方法。)