<script setup lang="ts">
import { onBeforeMount, onMounted, watch, computed } from 'vue';
import { useRouter, useRoute } from 'vue-router';
// import NotFound from '../pages/404.vue'
// import Loading from '../pages/loading.vue'
import { useUserStore } from '../stores/user';
import { useMenuStore } from '../stores/menu';
import { getUrlHashToken } from '../utils/token';
import { useLayoutRequired } from '../composables/useProvideInject';
import DefaultMainLayout from './MainLayout/index.vue';
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const menuStore = useMenuStore();
console.log('routes', router.getRoutes());
// 通过useLayoutRequired获å–MainLayout组件,æä¾›é»˜è®¤å€¼ä½œä¸ºåŽå¤‡
const MainLayout = useLayoutRequired(DefaultMainLayout);
// 使用计算属性获å–å“应å¼çš„ meta 对象
const meta = computed(() => route.meta);
function checkLogin() {
const token = getUrlHashToken();
// 如果tokenå˜åœ¨ï¼Œè¯´æ˜ŽUrlHashTokenå˜åœ¨ï¼Œé‡æ–°è·¯ç”±ï¼Œç¡®ä¿UrlHashToken消失,å¦åˆ™å¯¼èˆªå®Œä¹‹åŽUrlHashToken会å˜åœ¨
// åŒæ—¶è·¯ç”±å¿…须是匹é…上了æ‰è·³è½¬ï¼Œå¦åˆ™åˆå§‹è·¯ç”±é»˜è®¤â€œ/â€ï¼Œå°±ä¼šè·³è½¬åˆ°â€œ/â€è€Œä¸¢å¤±åŽŸæœ¬è·¯ç”±
if (token && route.matched.length > 0) {
router.push({ path: route.path, query: route.query });
}
}
// ç›‘å¬æ•´ä¸ªè·¯ç”±å¯¹è±¡å˜åŒ–
watch(
route,
(newRoute, oldRoute) => {
console.log('路由å˜åŒ–', {
newPath: newRoute.path,
oldPath: oldRoute?.path,
newMeta: newRoute.meta,
oldMeta: oldRoute?.meta,
});
// 在这里å¯ä»¥æ·»åŠ è·¯ç”±å˜åŒ–æ—¶éœ€è¦æ‰§è¡Œçš„逻辑
},
{ deep: true },
);
onBeforeMount(() => {
// å½“åˆ·æ–°é¡µé¢æ—¶ï¼Œå¯¼èˆªå®ˆå«beforeè¿˜æ²¡æ‰§è¡Œï¼Œè¿™é‡Œå…ˆæ‰§è¡Œäº†ï¼Œå› æ¤è¿™é‡Œå…ˆæ£€æŸ¥ç™»å½•情况
checkLogin();
});
onMounted(async () => {
try {
await userStore.fetchUserInfoAsync();
await menuStore.fetchMenuAsync();
} catch (e) {
console.error(e);
}
});
</script>
<template>
<!-- 如果是登录页é¢ï¼Œç›´æŽ¥è¿”回 -->
<template v-if="route.path === '/login'">
<slot />
</template>
<!-- æ— å¸ƒå±€ -->
<template v-else-if="meta.layout === false">
<slot />
</template>
<!-- 布局 -->
<template v-else>
<MainLayout>
<!-- ç»„ä»¶ç¼“å˜ -->
<KeepAlive v-if="meta.keepAlive">
<Transition
v-if="meta.transition"
v-bind="typeof meta.transition === 'object' ? meta.transition : {}"
>
<slot />
</Transition>
<slot v-else />
</KeepAlive>
<!-- æ— ç¼“å˜ä½†æœ‰è¿‡æ¸¡ -->
<Transition
v-else-if="meta.transition"
v-bind="typeof meta.transition === 'object' ? meta.transition : {}"
>
<slot />
</Transition>
<!-- æ— ç¼“å˜æ— 过渡 -->
<slot v-else />
</MainLayout>
</template>
</template>
|