feat: 初始化提交
笑笑 authored at 2025-05-13 21:25:06
2.60 KiB
cube-front
<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 MainLayout from './MainLayout/index.vue';
import { getUrlHashToken } from '../utils/token';

const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const menuStore = useMenuStore();
console.log('routes', router.getRoutes());

// 使用计算属性获取响应式的 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>