pageLoadingGuard.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import type { Router } from 'vue-router';
  2. import { tabStore } from '/@/store/modules/tab';
  3. import { appStore } from '/@/store/modules/app';
  4. import { userStore } from '/@/store/modules/user';
  5. export function createPageLoadingGuard(router: Router) {
  6. let isFirstLoad = true;
  7. router.beforeEach(async (to) => {
  8. const {
  9. openKeepAlive,
  10. openRouterTransition,
  11. openPageLoading,
  12. multiTabsSetting: { show } = {},
  13. } = appStore.getProjectConfig;
  14. if (!userStore.getTokenState) {
  15. return true;
  16. }
  17. if (!openRouterTransition && openPageLoading) {
  18. appStore.commitPageLoadingState(true);
  19. return true;
  20. }
  21. if (show && openKeepAlive && !isFirstLoad) {
  22. const tabList = tabStore.getTabsState;
  23. const isOpen = tabList.some((tab) => tab.path === to.path);
  24. appStore.setPageLoadingAction(!isOpen);
  25. } else {
  26. appStore.setPageLoadingAction(true);
  27. }
  28. return true;
  29. });
  30. router.afterEach(async (to) => {
  31. const { openRouterTransition, openPageLoading } = appStore.getProjectConfig;
  32. if ((!openRouterTransition && openPageLoading) || isFirstLoad || to.meta.afterCloseLoading) {
  33. setTimeout(() => {
  34. appStore.commitPageLoadingState(false);
  35. }, 110);
  36. isFirstLoad = false;
  37. }
  38. return true;
  39. });
  40. }