|
|
|
@ -1,14 +1,20 @@ |
|
|
|
import type { Component, DefineComponent } from 'vue'; |
|
|
|
|
|
|
|
import type { |
|
|
|
AccessModeType, |
|
|
|
GenerateMenuAndRoutesOptions, |
|
|
|
RouteRecordRaw, |
|
|
|
} from '@vben/types'; |
|
|
|
|
|
|
|
import { defineComponent, h } from 'vue'; |
|
|
|
|
|
|
|
import { |
|
|
|
cloneDeep, |
|
|
|
generateMenus, |
|
|
|
generateRoutesByBackend, |
|
|
|
generateRoutesByFrontend, |
|
|
|
isFunction, |
|
|
|
isString, |
|
|
|
mapTree, |
|
|
|
} from '@vben/utils'; |
|
|
|
|
|
|
|
@ -81,8 +87,31 @@ async function generateRoutes( |
|
|
|
/** |
|
|
|
* 调整路由树,做以下处理: |
|
|
|
* 1. 对未添加redirect的路由添加redirect |
|
|
|
* 2. 将懒加载的组件名称修改为当前路由的名称(如果启用了keep-alive的话) |
|
|
|
*/ |
|
|
|
resultRoutes = mapTree(resultRoutes, (route) => { |
|
|
|
// 重新包装component,使用与路由名称相同的name以支持keep-alive的条件缓存。
|
|
|
|
if ( |
|
|
|
route.meta?.keepAlive && |
|
|
|
isFunction(route.component) && |
|
|
|
route.name && |
|
|
|
isString(route.name) |
|
|
|
) { |
|
|
|
const originalComponent = route.component as () => Promise<{ |
|
|
|
default: Component | DefineComponent; |
|
|
|
}>; |
|
|
|
route.component = async () => { |
|
|
|
const component = await originalComponent(); |
|
|
|
if (!component.default) return component; |
|
|
|
return defineComponent({ |
|
|
|
name: route.name as string, |
|
|
|
setup(props, { attrs, slots }) { |
|
|
|
return () => h(component.default, { ...props, ...attrs }, slots); |
|
|
|
}, |
|
|
|
}); |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
// 如果有redirect或者没有子路由,则直接返回
|
|
|
|
if (route.redirect || !route.children || route.children.length === 0) { |
|
|
|
return route; |
|
|
|
|