bmenu.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { defineComponent, h, VNode } from "vue";
  2. import { useBase, Menu } from "/$/base";
  3. import { useCool } from "/@/cool";
  4. export default defineComponent({
  5. name: "b-menu",
  6. setup() {
  7. const { router, route, browser } = useCool();
  8. const { menu, app } = useBase();
  9. // 页面跳转
  10. function toView(url: string) {
  11. if (url != route.path) {
  12. router.push(url);
  13. }
  14. // 小屏下点击收起左侧菜单
  15. if (browser.isMini) {
  16. app.fold(true);
  17. }
  18. }
  19. // 渲染子菜单
  20. function renderMenu() {
  21. function deep(list: Menu.Item[], index: number) {
  22. return list
  23. .filter((e) => e.isShow)
  24. .map((e) => {
  25. const item = (e: Menu.Item) => {
  26. return (
  27. <div class="wrap">
  28. <cl-svg name={e.icon} />
  29. <span v-show={!app.isFold || index != 1}>{e.meta?.label}</span>
  30. </div>
  31. );
  32. };
  33. if (e.type == 0) {
  34. return h(
  35. <el-sub-menu />,
  36. {
  37. index: String(e.id),
  38. key: e.id,
  39. popperClass: "app-slider__menu"
  40. },
  41. {
  42. title() {
  43. return item(e);
  44. },
  45. default() {
  46. return deep(e.children || [], index + 1);
  47. }
  48. }
  49. );
  50. } else {
  51. return h(
  52. <el-menu-item />,
  53. {
  54. index:
  55. route.path == "/"
  56. ? e.meta?.isHome
  57. ? "/"
  58. : e.path
  59. : e.path,
  60. key: e.id
  61. },
  62. {
  63. default() {
  64. return item(e);
  65. }
  66. }
  67. );
  68. }
  69. });
  70. }
  71. return deep(menu.list, 1);
  72. }
  73. return () => {
  74. return (
  75. <div class="app-slider__menu">
  76. <el-menu
  77. default-active={route.path}
  78. background-color="transparent"
  79. collapse-transition={false}
  80. collapse={browser.isMini ? false : app.isFold}
  81. onSelect={toView}
  82. >
  83. {renderMenu()}
  84. </el-menu>
  85. </div>
  86. );
  87. };
  88. }
  89. });