[vue3-element-admin] 有来框架 点击菜单新标签页打开路由

1. 配置路由选项

\src\router\index.ts

在此目录下配置好需要单独打开页面的路由信息,我配置了`/screen`和`/cockpit` 这两个路由信息

// 静态路由
export const constantRoutes: RouteRecordRaw[] = [
  {
    path: "/redirect",
    component: Layout,
    meta: { hidden: true },
    children: [
      {
        path: "/redirect/:path(.*)",
        component: () => import("@/views/redirect/index.vue"),
      },
    ],
  },

  {
    path: "/login",
    component: () => import("@/views/login/index.vue"),
    meta: { hidden: true },
  },
  {
    path: "/screen",
    component: () => import("@/views/screen/index.vue"),
    meta: { hidden: true },
  },
  {
    path: "/cockpit",
    component: () => import("@/views/personnel-analysis/children/Cockpit/index.vue"),
    meta: { hidden: true },
  },

  {
    path: "/",
    name: "/",
    component: Layout,
    redirect: "/dashboard",
    children: [
      {
        path: "dashboard",
        component: () => import("@/views/dashboard/index.vue"),
        name: "Dashboard", // 用于 keep-alive, 必须与SFC自动推导或者显示声明的组件name一致
        // https://cn.vuejs.org/guide/built-ins/keep-alive.html#include-exclude
        meta: {
          title: "dashboard",
          icon: "homepage",
          affix: true,
          keepAlive: true,
          alwaysShow: false,
        },
      },
      {
        path: "401",
        component: () => import("@/views/error-page/401.vue"),
        meta: { hidden: true },
      },
      {
        path: "404",
        component: () => import("@/views/error-page/404.vue"),
        meta: { hidden: true },
      },
    ],
  },
];

2. 修改菜单组件源码

\src\layout\components\Sidebar\components\SidebarMenuItem.vue
必须使用a标签进行路由跳转,否则会出现重定向错误

<template>
  <div v-if="!item.meta || !item.meta.hidden">
    <!-- 显示具有单个子路由的菜单项或没有子路由的父路由 -->
    <template
      v-if="
        hasOneShowingChild(item.children, item as RouteRecordRaw) &&
        (!onlyOneChild.children || onlyOneChild.noShowingChildren) &&
        !item.meta?.alwaysShow
      "
    >
      <!-- onlyOneChild包含了路由的信息,最外层的菜单onlyOneChild.path / onlyOneChild.name都有路径,如果是嵌套路由菜单onlyOneChild.name才有路径,不确定的话可以在title上渲染onlyOneChild的信息查看 -->
      <!-- 该判断用于大屏页面单独打开新页面跳转,切记,如果有多个判断条件要使用v-else-if进行判断,不然会重复渲染 -->
      <!-- 当路径是 /screen 时,使用 a 标签并保持哈希路径跳转 -->
      <!-- 跳转的菜单1 -->
      <a v-if="onlyOneChild.name == '/screen'" href="#/screen" target="_blank">
        <el-menu-item
          :index="'#/screen'"
          :class="{ 'submenu-title-noDropdown': !isNest }"
        >
          <SidebarMenuItemTitle
            :icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"
            :title="onlyOneChild.meta.title"
          />
        </el-menu-item>
      </a>

      <!-- 当路径是 /cockpit 时,使用 a 标签并保持哈希路径跳转 -->
      <!-- 跳转的菜单2 -->
      <a
        v-else-if="onlyOneChild.name == '/cockpit'"
        href="#/cockpit"
        target="_blank"
      >
        <el-menu-item
          :index="'#/cockpit'"
          :class="{ 'submenu-title-noDropdown': !isNest }"
        >
          <SidebarMenuItemTitle
            :icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"
            :title="onlyOneChild.meta.title"
          />
        </el-menu-item>
      </a>

      <!-- 其他路径继续使用 AppLink -->
      <AppLink v-else :to="resolvePath(onlyOneChild.path)">
        <el-menu-item
          :index="resolvePath(onlyOneChild.path)"
          :class="{ 'submenu-title-noDropdown': !isNest }"
        >
          <SidebarMenuItemTitle
            :icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"
            :title="onlyOneChild.meta.title"
          />
        </el-menu-item>
      </AppLink>
    </template>

    <!-- 显示具有多个子路由的父菜单项 -->
    <el-sub-menu v-else :index="resolvePath(item.path)" teleported>
      <template #title>
        <SidebarMenuItemTitle
          v-if="item.meta"
          :icon="item.meta && item.meta.icon"
          :title="item.meta.title"
        />
      </template>

      <SidebarMenuItem
        v-for="child in item.children"
        :key="child.path"
        :is-nest="true"
        :item="child"
        :base-path="resolvePath(child.path)"
      />
    </el-sub-menu>
  </div>
</template>

实现效果如下

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值