【发布时间】:2022-01-19 09:26:55
【问题描述】:
我正在寻找一种可重用的方式来显示整个页面加载器(侧边栏始终可见,但加载器应该覆盖页面的内容部分),直到完成所有必要的 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 存储中,则子组件 (LaunchRocket) 将获取必要的存储数据并执行获取请求。完成此操作后,我希望在加载父组件时拥有一个完整页面加载器或一个完整页面加载器,以及一个包含嵌套画布的加载器。
此时 vuex 存储正在跟踪 isLoading 属性,由 axios 拦截器处理。
所有代码在这个sandbox中可见
(注意:在此示例中,我可以从 url 获取 rocket_id,但在我的项目中不会出现这种情况,所以我真的在寻找一种从 vuex 商店获取这些数据的方法)
【问题讨论】: