Проблемные маршруты в приложении Vue не отображаются должным образом

У меня есть приложение Vue 3 и в моем маршрутизаторе есть вложенные маршруты, однако у меня возникают проблемы с некоторыми из этих маршрутов, как только я хочу вызвать их явно через соответствующий URL-адрес или перезагрузить страницу с помощью F5.

Как только я это сделаю, компоненты, которые у меня есть в моем App.vue, например панель навигации, отображаются дважды, трижды или даже четыре раза и <router-view>для отображения содержимого страницы полностью исчезло.

Я отметил 3 проблемных маршрута в коде с помощью // [problematic].

      // Router - index.ts

import pinia from "@/store";
import { useProcessStore } from "@/store/process";
import { useUserStore } from "@/store/user";
import { createRouter, createWebHistory, RouteRecordRaw, RouterOptions } from "vue-router";

function loadView (view, subFolder = "") {
  // route level code-splitting: which is lazy-loaded when the route is visited.
  return () => import("../views/" + subFolder + view + ".vue");
}

async function checkLogin () {
  const userStore = useUserStore(pinia);
  await userStore.checkLogin();
}

const routes: Array<RouteRecordRaw> = [
  {
    path: "/",
    redirect: { name: "Cockpit" },
    beforeEnter: async () => {
      await checkLogin();
      return ;
    }
  },
  {
    path: "/cockpit",
    name: "Cockpit",
    component: loadView("Cockpit"),
    beforeEnter: async () => {
      await checkLogin();
      return true;
    }
  },
  {
    path: "/processes",
    name: "Processes",
    component: loadView("Processes", "processes/"),
    beforeEnter: async () => {
      await checkLogin();
      return true;
    }
  },
  {
    path: "/processes/new",
    name: "ProcessNew",
    component: loadView("ProcessNew", "processes/"),
    beforeEnter: async () => {
      await checkLogin();
      return true;
    }
  },
  {
    path: "/processes/:id", // [problematic]
    name: "ProcessView",
    component: loadView("ProcessView", "processes/"),
    beforeEnter: async (to) => {
      await checkLogin();
      const processStore = useProcessStore(pinia);
      processStore.$reset();
      await processStore.readProcess(to.params.id);
      return true;
    },
    children: [
      {
        path: "steer", // [problematic]
        name: "ProcessSteer",
        component: loadView("ProcessSteer", "processes/"),
        beforeEnter: async (to) => {
          const processStore = useProcessStore(pinia);
          if (processStore.process_status !== "in_control") {
            return { name: "ProcessView", params: { id: to.params.id } };
          }
          return true;
        }
      },
      {
        path: "approve/:code", // [problematic]
        name: "ProcessApprove",
        component: loadView("ProcessApproval", "processes/"),
        beforeEnter: async (to) => {
          const processStore = useProcessStore(pinia);
          if (processStore.process_status !== "in_approval" && !processStore.checkApprovalCode(to.params.code)) {
            return { name: "ProcessView", params: { id: to.params.id } };
          }
          return true;
        }
      }
    ]
  },
  {
    path: "/admin",
    name: "Admin",
    component: loadView("Admin"),
    beforeEnter: async () => {
      await checkLogin();
      // TODO: check admin status
      return true;
    },
    children: [
      {
        path: "users",
        name: "Users",
        component: loadView("Users"),
        beforeEnter: async () => {
          await checkLogin();
          console.log("test");
          return true;
        }
      },
      {
        path: "analysis",
        name: "Analysis",
        component: loadView("Analysis")
      },
    ]
  },
  {
    path: "/settings",
    name: "Settings",
    component: loadView("Settings"),
    beforeEnter: async () => {
      await checkLogin();
      return true;
    }
  },
  {
    path: "/error",
    name: "Error",
    component: loadView("Error"),
    props: true
  },
  {
    path: "/:catchAll(.*)",
    redirect: { name: "Error" }
  }
];

const router = createRouter(<RouterOptions>{
  history: createWebHistory(import.meta.env.BASE_URL),
  routes
});

export default router;

0 ответов

Другие вопросы по тегам