🔱: [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:
GitHub Actions Bot
2025-03-03 19:24:51 +00:00
parent de26ee9383
commit 335d175d57
649 changed files with 36984 additions and 826 deletions
@@ -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";