Browse Source
feat: 修正菜单排序在二级菜单不生效问题 (#7007)
* treeUtil增加对树形结构数据进行递归排序
* 菜单sort排序各级菜单均生效
pull/7041/head
xueyitt
2 months ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with
31 additions and
3 deletions
-
packages/@core/base/shared/src/utils/tree.ts
-
packages/utils/src/helpers/generate-menus.ts
|
|
|
@ -94,4 +94,32 @@ function mapTree<T, V extends Record<string, any>>( |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
export { filterTree, mapTree, traverseTreeValues }; |
|
|
|
/** |
|
|
|
* 对树形结构数据进行递归排序 |
|
|
|
* @param treeData - 树形数据数组 |
|
|
|
* @param sortFunction - 排序函数,用于定义排序规则 |
|
|
|
* @param options - 配置选项,包括子节点属性名 |
|
|
|
* @returns 排序后的树形数据 |
|
|
|
*/ |
|
|
|
function sortTree<T extends Record<string, any>>( |
|
|
|
treeData: T[], |
|
|
|
sortFunction: (a: T, b: T) => number, |
|
|
|
options?: TreeConfigOptions, |
|
|
|
): T[] { |
|
|
|
const { childProps } = options || { |
|
|
|
childProps: 'children', |
|
|
|
}; |
|
|
|
|
|
|
|
return treeData.toSorted(sortFunction).map((item) => { |
|
|
|
const children = item[childProps]; |
|
|
|
if (children && Array.isArray(children) && children.length > 0) { |
|
|
|
return { |
|
|
|
...item, |
|
|
|
[childProps]: sortTree(children, sortFunction, options), |
|
|
|
}; |
|
|
|
} |
|
|
|
return item; |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
export { filterTree, mapTree, sortTree, traverseTreeValues }; |
|
|
|
|
|
|
|
@ -6,7 +6,7 @@ import type { |
|
|
|
RouteMeta, |
|
|
|
} from '@vben-core/typings'; |
|
|
|
|
|
|
|
import { filterTree, mapTree } from '@vben-core/shared/utils'; |
|
|
|
import { filterTree, mapTree, sortTree } from '@vben-core/shared/utils'; |
|
|
|
|
|
|
|
/** |
|
|
|
* 根据 routes 生成菜单列表 |
|
|
|
@ -81,7 +81,7 @@ function generateMenus( |
|
|
|
}); |
|
|
|
|
|
|
|
// 对菜单进行排序,避免order=0时被替换成999的问题
|
|
|
|
menus = menus.toSorted((a, b) => (a?.order ?? 999) - (b?.order ?? 999)); |
|
|
|
menus = sortTree(menus, (a, b) => (a?.order ?? 999) - (b?.order ?? 999)); |
|
|
|
|
|
|
|
// 过滤掉隐藏的菜单项
|
|
|
|
return filterTree(menus, (menu) => !!menu.show); |
|
|
|
|