处理自动路由提供的路由对象
功能介绍
disposalAutoRouter 函数用于处理来自 vue-router/auto-routes 提供的路由数据,解决自动生成路由时产生的"脏数据"问题。主要功能包括:
- 将空路径子路由(
path: "")的信息提取到父级路由 - 拼接子路由的完整路径,例如将
message-center拼接为/message-middle/message-center - 删除空路径路由和空
children数组 - 保留正常路由结构,生成符合规范的嵌套路由配置
工作流程
整个处理过程分为两个主要函数:
disposalAutoRouter 函数
该函数作为入口,接收一个路由数组,并对每个顶级路由调用 processRoute 函数进行处理。
typescript
export function disposalAutoRouter(routes: RouteRecordRaw[]): RouteRecordRaw[] {
if (!Array.isArray(routes) || routes.length === 0) {
return [];
}
// 处理所有顶级路由
return routes.map((route) => processRoute(route));
}processRoute 函数
这是核心处理逻辑,采用递归方式处理嵌套路由。流程如下:
- 创建路由副本,避免修改原始对象
- 拼接完整路径(合并父路径和当前路径)
- 处理子路由:
- 查找空路径子路由(
path: "") - 使用
lodash-es的omit函数,将空路径子路由的除path外所有属性复制到父路由 - 过滤掉空路径子路由
- 递归处理剩余的子路由,拼接完整路径
- 如果处理后没有子路由,则删除
children属性
- 查找空路径子路由(
- 返回处理后的路由对象
数据流转图
数据转换示例
输入数据(原始路由)
js
const routeFromAutoRouter = {
path: "/message-middle",
children: [
{
path: "",
name: "message-middle",
meta: {
menuType: "folder",
text: "消息中间件",
icon: "IconMessage",
},
alias: [],
},
{
path: "message-center",
children: [
{
path: "",
name: "message-middle-message-center",
meta: {
menuType: "page",
text: "消息中心",
icon: "IconMessage",
},
alias: [],
},
],
},
],
};输出数据(处理后的路由)
js
const processedRoute = {
path: "/message-middle",
name: "message-middle", // 从空路径子路由获取
meta: {
// 从空路径子路由获取
menuType: "folder",
text: "消息中间件",
icon: "IconMessage",
},
alias: [], // 从空路径子路由获取
children: [
{
path: "/message-middle/message-center", // 路径已拼接完整
name: "message-middle-message-center",
meta: {
menuType: "page",
text: "消息中心",
icon: "IconMessage",
},
alias: [],
},
],
};关键技术点
- 递归处理:通过递归处理嵌套路由,确保所有层级的路由都能正确处理
- 属性复制:使用
lodash-es的omit函数配合Object.assign,确保完整复制除path外的所有属性 - 路径拼接:智能拼接父路径和子路径,生成完整的路由路径
- 数据清理:删除空路径子路由和空的
children数组,保持数据整洁
使用场景
该函数主要用于处理自动生成的路由配置,特别适用于:
- 使用
unplugin-vue-router等插件自动生成的路由配置 - 需要将文件夹结构转换为路由结构的场景
- 需要规范化路由配置的场景
AI 生成的文档
警告
本文全文都是用 AI 生成的,请注意甄别。