route-menu.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { Menu as MenuRaw } from 'antd'
  2. import { useRoute, findRouteByPathName } from 'router'
  3. import type { MenuProps } from 'antd'
  4. import type { RouteConfig, RouteConfigTree } from 'router'
  5. type MenuItems = Required<MenuProps>['items']
  6. type MenuProp = {
  7. routes: RouteConfig[] | undefined,
  8. onSelect?: (route: RouteConfigTree) => void
  9. }
  10. export const routesToMenuItems = (routes: MenuProp['routes']): MenuItems | undefined => {
  11. if (!routes) {
  12. return;
  13. }
  14. return routes
  15. .filter(route => route.meta)
  16. .map(route => ({
  17. ...route.meta,
  18. icon: route.meta?.icon && <route.meta.icon />,
  19. key: route.path,
  20. children: routesToMenuItems(route.children)
  21. }))
  22. }
  23. export const RouteMenu = ({ routes, onSelect }: MenuProp) => {
  24. const route = useRoute()
  25. const menuItems = routesToMenuItems(routes)
  26. const onClick: MenuProps['onClick'] = e => {
  27. const routeTree = findRouteByPathName(e.key) as RouteConfigTree
  28. onSelect && onSelect(routeTree)
  29. };
  30. const selectKeys = route?.path ? [route?.path] : []
  31. return (
  32. <MenuRaw
  33. onClick={onClick}
  34. defaultSelectedKeys={selectKeys}
  35. mode="inline"
  36. items={menuItems}
  37. />
  38. )
  39. }