Commit c6b766d8ea902294ab1f7e4a06781f2bcfdd1f0b

Authored by 无木
1 parent a222ec85

fix(route): dynamically introduce components error

修复后台权限模式下,加载IFrame类型的路由时会丢失component的问题
mock/sys/menu.ts
@@ -168,6 +168,34 @@ const sysRoute = { @@ -168,6 +168,34 @@ const sysRoute = {
168 ], 168 ],
169 }; 169 };
170 170
  171 +const linkRoute = {
  172 + path: '/link',
  173 + name: 'Link',
  174 + component: 'LAYOUT',
  175 + meta: {
  176 + icon: 'ion:tv-outline',
  177 + title: 'routes.demo.iframe.frame',
  178 + },
  179 + children: [
  180 + {
  181 + path: 'doc',
  182 + name: 'Doc',
  183 + meta: {
  184 + title: 'routes.demo.iframe.doc',
  185 + frameSrc: 'https://vvbin.cn/doc-next/',
  186 + },
  187 + },
  188 + {
  189 + path: 'https://vvbin.cn/doc-next/',
  190 + name: 'DocExternal',
  191 + component: 'LAYOUT',
  192 + meta: {
  193 + title: 'routes.demo.iframe.docExternal',
  194 + },
  195 + },
  196 + ],
  197 +};
  198 +
171 export default [ 199 export default [
172 { 200 {
173 url: '/basic-api/getMenuList', 201 url: '/basic-api/getMenuList',
@@ -184,10 +212,10 @@ export default [ @@ -184,10 +212,10 @@ export default [
184 } 212 }
185 const id = checkUser.userId; 213 const id = checkUser.userId;
186 if (!id || id === '1') { 214 if (!id || id === '1') {
187 - return resultSuccess([dashboardRoute, authRoute, levelRoute, sysRoute]); 215 + return resultSuccess([dashboardRoute, authRoute, levelRoute, sysRoute, linkRoute]);
188 } 216 }
189 if (id === '2') { 217 if (id === '2') {
190 - return resultSuccess([dashboardRoute, authRoute, levelRoute]); 218 + return resultSuccess([dashboardRoute, authRoute, levelRoute, linkRoute]);
191 } 219 }
192 }, 220 },
193 }, 221 },
src/router/helper/routeHelper.ts
@@ -7,8 +7,12 @@ import { warn } from '/@/utils/log'; @@ -7,8 +7,12 @@ import { warn } from '/@/utils/log';
7 import { createRouter, createWebHashHistory } from 'vue-router'; 7 import { createRouter, createWebHashHistory } from 'vue-router';
8 8
9 export type LayoutMapKey = 'LAYOUT'; 9 export type LayoutMapKey = 'LAYOUT';
  10 +const IFRAME = () => import('/@/views/sys/iframe/FrameBlank.vue');
10 11
11 -const LayoutMap = new Map<LayoutMapKey, () => Promise<typeof import('*.vue')>>(); 12 +const LayoutMap = new Map<String, () => Promise<typeof import('*.vue')>>();
  13 +
  14 +LayoutMap.set('LAYOUT', LAYOUT);
  15 +LayoutMap.set('IFRAME', IFRAME);
12 16
13 let dynamicViewsModules: Record<string, () => Promise<Recordable>>; 17 let dynamicViewsModules: Record<string, () => Promise<Recordable>>;
14 18
@@ -17,10 +21,18 @@ function asyncImportRoute(routes: AppRouteRecordRaw[] | undefined) { @@ -17,10 +21,18 @@ function asyncImportRoute(routes: AppRouteRecordRaw[] | undefined) {
17 dynamicViewsModules = dynamicViewsModules || import.meta.glob('../../views/**/*.{vue,tsx}'); 21 dynamicViewsModules = dynamicViewsModules || import.meta.glob('../../views/**/*.{vue,tsx}');
18 if (!routes) return; 22 if (!routes) return;
19 routes.forEach((item) => { 23 routes.forEach((item) => {
  24 + if (!item.component && item.meta?.frameSrc) {
  25 + item.component = 'IFRAME';
  26 + }
20 const { component, name } = item; 27 const { component, name } = item;
21 const { children } = item; 28 const { children } = item;
22 if (component) { 29 if (component) {
23 - item.component = dynamicImport(dynamicViewsModules, component as string); 30 + const layoutFound = LayoutMap.get(component);
  31 + if (layoutFound) {
  32 + item.component = layoutFound;
  33 + } else {
  34 + item.component = dynamicImport(dynamicViewsModules, component as string);
  35 + }
24 } else if (name) { 36 } else if (name) {
25 item.component = getParentLayout(); 37 item.component = getParentLayout();
26 } 38 }
@@ -53,8 +65,6 @@ function dynamicImport( @@ -53,8 +65,6 @@ function dynamicImport(
53 65
54 // Turn background objects into routing objects 66 // Turn background objects into routing objects
55 export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModule[]): T[] { 67 export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModule[]): T[] {
56 - LayoutMap.set('LAYOUT', LAYOUT);  
57 -  
58 routeList.forEach((route) => { 68 routeList.forEach((route) => {
59 if (route.component) { 69 if (route.component) {
60 if ((route.component as string).toUpperCase() === 'LAYOUT') { 70 if ((route.component as string).toUpperCase() === 'LAYOUT') {