40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
import { RouteRecordRaw, RouteLocationNormalized } from 'vue-router';
|
|
|
|
export function getParentChildrenRoutes(route: RouteLocationNormalized): RouteRecordRaw[] {
|
|
// 没有任何匹配路由,直接返回空
|
|
if (!route.matched || route.matched.length === 0) {
|
|
return [];
|
|
}
|
|
|
|
// 从当前路由向上查找,找到第一个“有可见子路由”的父级
|
|
for (let i = route.matched.length - 2; i >= 0; i--) {
|
|
const parentRoute = route.matched[i];
|
|
const children = parentRoute?.children || [];
|
|
|
|
if (!children || children.length === 0) {
|
|
continue;
|
|
}
|
|
|
|
const visibleChildren = children.filter((child: RouteRecordRaw) => {
|
|
// 必须有 title
|
|
if (!child.meta?.title) {
|
|
return false;
|
|
}
|
|
// 排除 path 为空字符串的子路由(通常是默认子路由)
|
|
if (child.path === '' || child.path === undefined) {
|
|
return false;
|
|
}
|
|
// 排除 name 以 _page 结尾的子路由(父路由的默认子路由)
|
|
if (typeof child.name === 'string' && child.name.endsWith('_page')) {
|
|
return false;
|
|
}
|
|
return true;
|
|
});
|
|
|
|
if (visibleChildren.length > 0) {
|
|
return visibleChildren;
|
|
}
|
|
}
|
|
|
|
return [];
|
|
} |