mirror of
https://github.com/certd/certd.git
synced 2026-06-28 06:27:31 +08:00
🔱: [client] sync upgrade with 7 commits [trident-sync]
chore: Merge branch 'vben' # Conflicts: # package.json perf: antdv示例改成使用vben框架 chore: vben chore: vben chore: vben
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
<script lang="ts" setup>
|
||||
import type { RouteLocationNormalized } from "vue-router";
|
||||
|
||||
import { computed, ref } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
|
||||
import { preferences } from "../../preferences";
|
||||
import { useTabbarStore } from "../../stores";
|
||||
|
||||
import { VbenSpinner } from "../../shadcn-ui";
|
||||
|
||||
defineOptions({ name: "IFrameRouterView" });
|
||||
|
||||
const spinningList = ref<boolean[]>([]);
|
||||
const tabbarStore = useTabbarStore();
|
||||
const route = useRoute();
|
||||
|
||||
const enableTabbar = computed(() => preferences.tabbar.enable);
|
||||
|
||||
const iframeRoutes = computed(() => {
|
||||
if (!enableTabbar.value) {
|
||||
return route.meta.iframeSrc ? [route] : [];
|
||||
}
|
||||
return tabbarStore.getTabs.filter((tab: any) => !!tab.meta?.iframeSrc);
|
||||
});
|
||||
|
||||
const tabNames = computed(() => new Set(iframeRoutes.value.map((item: any) => item.name as string)));
|
||||
|
||||
const showIframe = computed(() => iframeRoutes.value.length > 0);
|
||||
|
||||
function routeShow(tabItem: RouteLocationNormalized) {
|
||||
return tabItem.name === route.name;
|
||||
}
|
||||
|
||||
function canRender(tabItem: RouteLocationNormalized) {
|
||||
const { meta, name } = tabItem;
|
||||
|
||||
if (!name || !tabbarStore.renderRouteView) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!enableTabbar.value) {
|
||||
return routeShow(tabItem);
|
||||
}
|
||||
|
||||
// 跟随 keepAlive 状态,与其他tab页保持一致
|
||||
if (!meta?.keepAlive && tabNames.value.has(name as string) && name !== route.name) {
|
||||
return false;
|
||||
}
|
||||
return tabbarStore.getTabs.some((tab: any) => tab.name === name);
|
||||
}
|
||||
|
||||
function hideLoading(index: number) {
|
||||
spinningList.value[index] = false;
|
||||
}
|
||||
|
||||
function showSpinning(index: number) {
|
||||
const curSpinning = spinningList.value[index];
|
||||
// 首次加载时显示loading
|
||||
return curSpinning === undefined ? true : curSpinning;
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<template v-if="showIframe">
|
||||
<template v-for="(item, index) in iframeRoutes" :key="item.fullPath">
|
||||
<div v-if="canRender(item)" v-show="routeShow(item)" class="relative size-full">
|
||||
<VbenSpinner :spinning="showSpinning(index)" />
|
||||
<iframe :src="item.meta.iframeSrc as string" class="size-full" @load="hideLoading(index)"></iframe>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
</template>
|
||||
@@ -0,0 +1,3 @@
|
||||
<template>
|
||||
<div></div>
|
||||
</template>
|
||||
@@ -0,0 +1,2 @@
|
||||
export { default as IFrameRouterView } from "./iframe-router-view.vue";
|
||||
export { default as IFrameView } from "./iframe-view.vue";
|
||||
Reference in New Issue
Block a user