@ditari/bsui 1.1.49 → 1.1.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var useMenuCore = () => {
6
+ const findMatchedMenuById = (id, menuItems) => {
7
+ const targetItem = findMenuItemById(id, menuItems);
8
+ if (!targetItem)
9
+ return { matchItem: null, parentItem: null };
10
+ if (!targetItem.parentId) {
11
+ return {
12
+ matchItem: targetItem,
13
+ parentItem: null
14
+ };
15
+ }
16
+ const parentItem = findMenuItemById(targetItem.parentId, menuItems);
17
+ return {
18
+ matchItem: targetItem,
19
+ parentItem: parentItem ? parentItem : null
20
+ };
21
+ };
22
+ const findMenuItemById = (id, menuItems) => {
23
+ for (const item of menuItems) {
24
+ if (item.id === id)
25
+ return item;
26
+ if (item.children) {
27
+ const found = findMenuItemById(id, item.children);
28
+ if (found)
29
+ return found;
30
+ }
31
+ }
32
+ return null;
33
+ };
34
+ const findMenuItemByUrl = (url, menuItems) => {
35
+ for (const item of menuItems) {
36
+ if (item.url === url)
37
+ return item;
38
+ if (item.children) {
39
+ const found = findMenuItemByUrl(url, item.children);
40
+ if (found)
41
+ return found;
42
+ }
43
+ }
44
+ return null;
45
+ };
46
+ return {
47
+ findMatchedMenuById,
48
+ findMenuItemByUrl
49
+ };
50
+ };
51
+
52
+ exports.default = useMenuCore;
53
+ //# sourceMappingURL=useMenuCore.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMenuCore.cjs","sources":["../../../src/menu/useMenuCore.ts"],"sourcesContent":["export default () => {\n /**\n * 通过 id 查找菜单项(包括其 path 和父级 path)\n * @param id 要查找的菜单项 id\n * @param menuItems 菜单数据\n * @returns { matchedPath: string; parentPath: string | null } | null\n */\n const findMatchedMenuById = (\n id: string,\n menuItems: any[]\n ): { parentItem: any; matchItem: any } => {\n // 先找到目标菜单项\n const targetItem = findMenuItemById(id, menuItems);\n if (!targetItem) return { matchItem: null, parentItem: null };\n\n // 如果是顶级菜单,parentPath 为 null\n if (!targetItem.parentId) {\n return {\n matchItem: targetItem,\n parentItem: null\n };\n }\n\n // 否则找到父级菜单的 path\n const parentItem = findMenuItemById(targetItem.parentId, menuItems);\n return {\n matchItem: targetItem,\n parentItem: parentItem ? parentItem : null\n };\n };\n\n /**\n * 通过 id 查找单个菜单项(辅助函数)\n */\n const findMenuItemById = (id: string, menuItems: any[]): any | null => {\n for (const item of menuItems) {\n if (item.id === id) return item;\n if (item.children) {\n const found = findMenuItemById(id, item.children);\n if (found) return found;\n }\n }\n return null;\n };\n\n const findMenuItemByUrl = (url: string, menuItems: any[]): any => {\n for (const item of menuItems) {\n if (item.url === url) return item;\n if (item.children) {\n const found = findMenuItemByUrl(url, item.children);\n if (found) return found;\n }\n }\n return null;\n };\n\n return {\n findMatchedMenuById,\n findMenuItemByUrl\n };\n};\n"],"names":[],"mappings":";;;;AAAA,kBAAe,MAAM;AAOnB,EAAM,MAAA,mBAAA,GAAsB,CAC1B,EAAA,EACA,SACwC,KAAA;AAExC,IAAM,MAAA,UAAA,GAAa,gBAAiB,CAAA,EAAA,EAAI,SAAS,CAAA,CAAA;AACjD,IAAA,IAAI,CAAC,UAAA;AAAY,MAAA,OAAO,EAAE,SAAA,EAAW,IAAM,EAAA,UAAA,EAAY,IAAK,EAAA,CAAA;AAG5D,IAAI,IAAA,CAAC,WAAW,QAAU,EAAA;AACxB,MAAO,OAAA;AAAA,QACL,SAAW,EAAA,UAAA;AAAA,QACX,UAAY,EAAA,IAAA;AAAA,OACd,CAAA;AAAA,KACF;AAGA,IAAA,MAAM,UAAa,GAAA,gBAAA,CAAiB,UAAW,CAAA,QAAA,EAAU,SAAS,CAAA,CAAA;AAClE,IAAO,OAAA;AAAA,MACL,SAAW,EAAA,UAAA;AAAA,MACX,UAAA,EAAY,aAAa,UAAa,GAAA,IAAA;AAAA,KACxC,CAAA;AAAA,GACF,CAAA;AAKA,EAAM,MAAA,gBAAA,GAAmB,CAAC,EAAA,EAAY,SAAiC,KAAA;AACrE,IAAA,KAAA,MAAW,QAAQ,SAAW,EAAA;AAC5B,MAAA,IAAI,KAAK,EAAO,KAAA,EAAA;AAAI,QAAO,OAAA,IAAA,CAAA;AAC3B,MAAA,IAAI,KAAK,QAAU,EAAA;AACjB,QAAA,MAAM,KAAQ,GAAA,gBAAA,CAAiB,EAAI,EAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AAChD,QAAI,IAAA,KAAA;AAAO,UAAO,OAAA,KAAA,CAAA;AAAA,OACpB;AAAA,KACF;AACA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAM,MAAA,iBAAA,GAAoB,CAAC,GAAA,EAAa,SAA0B,KAAA;AAChE,IAAA,KAAA,MAAW,QAAQ,SAAW,EAAA;AAC5B,MAAA,IAAI,KAAK,GAAQ,KAAA,GAAA;AAAK,QAAO,OAAA,IAAA,CAAA;AAC7B,MAAA,IAAI,KAAK,QAAU,EAAA;AACjB,QAAA,MAAM,KAAQ,GAAA,iBAAA,CAAkB,GAAK,EAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AAClD,QAAI,IAAA,KAAA;AAAO,UAAO,OAAA,KAAA,CAAA;AAAA,OACpB;AAAA,KACF;AACA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAO,OAAA;AAAA,IACL,mBAAA;AAAA,IACA,iBAAA;AAAA,GACF,CAAA;AACF,CAAA;;;;"}
@@ -0,0 +1,8 @@
1
+ declare const _default: () => {
2
+ findMatchedMenuById: (id: string, menuItems: any[]) => {
3
+ parentItem: any;
4
+ matchItem: any;
5
+ };
6
+ findMenuItemByUrl: (url: string, menuItems: any[]) => any;
7
+ };
8
+ export default _default;
@@ -107,27 +107,9 @@ declare const _default: import("vue").DefineComponent<{
107
107
  deleteKeepAlive(name: string): void;
108
108
  save(route: import("vue-router").RouteLocationNormalized): void;
109
109
  }>;
110
- menuStore: import("pinia").Store<string, {
111
- list: never[];
112
- openMenusKeys: any;
113
- selectedMenuKeys: any;
114
- }, {
115
- getMenu: (state: {
116
- list: never[];
117
- openMenusKeys: any;
118
- selectedMenuKeys: any;
119
- } & import("pinia").PiniaCustomStateProperties<{
120
- list: never[];
121
- openMenusKeys: any;
122
- selectedMenuKeys: any;
123
- }>) => never[];
124
- }, {
125
- save(data: any): void;
126
- }>;
110
+ activeKey: import("vue").Ref<string>;
127
111
  baseClassName: string;
128
112
  navTabs: import("vue").Ref<any[]>;
129
- selectedMenuKeys: import("vue").Ref<any>;
130
- activeKey: import("vue").Ref<string>;
131
113
  setNavTabs: () => void;
132
114
  onClick: (key: string) => void;
133
115
  onClose: ($event: any, key: string) => void;
@@ -107,27 +107,9 @@ declare const _default: import("vue").DefineComponent<{
107
107
  deleteKeepAlive(name: string): void;
108
108
  save(route: import("vue-router").RouteLocationNormalized): void;
109
109
  }>;
110
- menuStore: import("pinia").Store<string, {
111
- list: never[];
112
- openMenusKeys: any;
113
- selectedMenuKeys: any;
114
- }, {
115
- getMenu: (state: {
116
- list: never[];
117
- openMenusKeys: any;
118
- selectedMenuKeys: any;
119
- } & import("pinia").PiniaCustomStateProperties<{
120
- list: never[];
121
- openMenusKeys: any;
122
- selectedMenuKeys: any;
123
- }>) => never[];
124
- }, {
125
- save(data: any): void;
126
- }>;
110
+ activeKey: import("vue").Ref<string>;
127
111
  baseClassName: string;
128
112
  navTabs: import("vue").Ref<any[]>;
129
- selectedMenuKeys: import("vue").Ref<any>;
130
- activeKey: import("vue").Ref<string>;
131
113
  setNavTabs: () => void;
132
114
  onClick: (key: string) => void;
133
115
  onClose: ($event: any, key: string) => void;
@@ -9,6 +9,9 @@ declare const _default: import("vue").DefineComponent<{}, {
9
9
  getList: (state: {
10
10
  list: {
11
11
  path: string;
12
+ /**
13
+ * 标签组件
14
+ */
12
15
  fullPath: string;
13
16
  query: import("vue-router").LocationQuery;
14
17
  params: import("vue-router").RouteParams;
@@ -52,27 +55,9 @@ declare const _default: import("vue").DefineComponent<{}, {
52
55
  deleteKeepAlive(name: string): void;
53
56
  save(route: import("vue-router").RouteLocationNormalized): void;
54
57
  }>;
55
- menuStore: import("pinia").Store<string, {
56
- list: never[];
57
- openMenusKeys: any;
58
- selectedMenuKeys: any;
59
- }, {
60
- getMenu: (state: {
61
- list: never[];
62
- openMenusKeys: any;
63
- selectedMenuKeys: any;
64
- } & import("pinia").PiniaCustomStateProperties<{
65
- list: never[];
66
- openMenusKeys: any;
67
- selectedMenuKeys: any;
68
- }>) => never[];
69
- }, {
70
- save(data: any): void;
71
- }>;
58
+ activeKey: Ref<string>;
72
59
  baseClassName: string;
73
60
  navTabs: Ref<any[]>;
74
- selectedMenuKeys: Ref<any>;
75
- activeKey: Ref<string>;
76
61
  setNavTabs: () => void;
77
62
  onClick: (key: string) => void;
78
63
  onClose: ($event: any, key: string) => void;
@@ -1,8 +1,8 @@
1
- import { createElementVNode, defineComponent, computed, ref, watchEffect, watch, resolveComponent, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, Fragment, renderList, createBlock, toDisplayString, unref, createCommentVNode } from 'vue';
1
+ import { createElementVNode, defineComponent, computed, watch, resolveComponent, openBlock, createElementBlock, normalizeClass, createVNode, unref, isRef, withCtx, Fragment, renderList, createBlock, toDisplayString, createCommentVNode } from 'vue';
2
2
  import { useRoute, useRouter } from 'vue-router';
3
3
  import { CloseOutlined } from '@ant-design/icons-vue';
4
4
  import { storeToRefs } from 'pinia';
5
- import { useNavTabsStore, useKeepAliveStore, useMenuStore } from '@ditari/store';
5
+ import { useNavTabsStore, useKeepAliveStore } from '@ditari/store';
6
6
  import { prefixName } from '../theme/index.mjs';
7
7
 
8
8
  const _hoisted_1 = /* @__PURE__ */ createElementVNode(
@@ -23,24 +23,22 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
23
23
  const router = useRouter();
24
24
  const navStore = useNavTabsStore();
25
25
  const keepAliveStore = useKeepAliveStore();
26
- const menuStore = useMenuStore();
26
+ const { activeKey } = storeToRefs(navStore);
27
27
  const baseClassName = `${prefixName}-nav`;
28
28
  const navTabs = computed(() => navStore.getList);
29
- const { selectedMenuKeys } = storeToRefs(menuStore);
30
- const activeKey = ref("");
31
- watchEffect(() => {
32
- activeKey.value = selectedMenuKeys.value.length > 0 ? selectedMenuKeys.value[0] : "";
33
- });
34
- setNavTabs();
35
29
  watch(
36
- () => route.path,
37
- () => {
30
+ () => route.fullPath,
31
+ (val) => {
38
32
  setNavTabs();
33
+ activeKey.value = val;
34
+ },
35
+ {
36
+ immediate: true
39
37
  }
40
38
  );
39
+ setNavTabs();
41
40
  function setNavTabs() {
42
41
  navStore.save(route);
43
- selectedMenuKeys.value = [route.path];
44
42
  keepAliveStore.save(route);
45
43
  }
46
44
  const onClick = (key) => {
@@ -74,8 +72,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
74
72
  class: normalizeClass(baseClassName)
75
73
  }, [
76
74
  createVNode(_component_a_tabs, {
77
- activeKey: activeKey.value,
78
- "onUpdate:activeKey": _cache[0] || (_cache[0] = ($event) => activeKey.value = $event),
75
+ activeKey: unref(activeKey),
76
+ "onUpdate:activeKey": _cache[0] || (_cache[0] = ($event) => isRef(activeKey) ? activeKey.value = $event : null),
79
77
  type: "card",
80
78
  onTabClick: onClick
81
79
  }, {
@@ -95,7 +93,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
95
93
  createElementVNode(
96
94
  "div",
97
95
  {
98
- class: normalizeClass(["tab-item", { active: activeKey.value === item.path }])
96
+ class: normalizeClass(["tab-item", { active: unref(activeKey) === item.path }])
99
97
  },
100
98
  toDisplayString(item.meta.title),
101
99
  3
@@ -1 +1 @@
1
- {"version":3,"file":"NavTabs.vue2.mjs","sources":["../../../src/layout/NavTabs.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * 标签组件\n */\nimport { computed, Ref, watch, watchEffect, ref } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { CloseOutlined } from \"@ant-design/icons-vue\";\nimport { storeToRefs } from \"pinia\";\n\nimport {\n useNavTabsStore,\n useKeepAliveStore,\n useMenuStore\n} from \"@ditari/store\";\n\nimport { prefixName } from \"../theme\";\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst navStore = useNavTabsStore();\nconst keepAliveStore = useKeepAliveStore();\nconst menuStore = useMenuStore();\n\n//class名称\nconst baseClassName = `${prefixName}-nav`;\n\n//标签列表\nconst navTabs: Ref<any[]> = computed(() => navStore.getList);\n// 被选中的菜单\nconst { selectedMenuKeys } = storeToRefs(menuStore);\n//当前被激活的标签 通过选中的菜单得到\nconst activeKey = ref(\"\");\nwatchEffect(() => {\n activeKey.value =\n selectedMenuKeys.value.length > 0 ? selectedMenuKeys.value[0] : \"\";\n});\n//首次进入页面或者刷新的时候执行\nsetNavTabs();\n// 监听路由变化\nwatch(\n () => route.path,\n () => {\n //TODO 需要优化 确保只有未打开过的标签 进入保存\n setNavTabs();\n }\n);\n\n//设置标签\nfunction setNavTabs() {\n // 保存标签\n navStore.save(route);\n // 设置激活的标签\n //navStore.setActiveKey(route.path);\n selectedMenuKeys.value = [route.path];\n keepAliveStore.save(route);\n}\n\n/**\n * 切换标签\n * @param nav\n */\nconst onClick = (key: string) => {\n if (key !== route.path) {\n // 匹配打开的标签路由数据\n const rs = navTabs.value.filter((item: any) => item.path === key)[0];\n // 打开路由\n router.push({\n path: rs.path,\n query: rs.query,\n params: rs.params,\n fullPath: rs.fullPath\n } as any);\n }\n};\n\n/**\n * 关闭标签\n * @param $event\n * @param targetKey\n */\nconst onClose = ($event: any, key: string) => {\n //const rs = navTabs.value.find((item) => item.fullPath === key) as any;\n //阻止冒泡\n $event.stopPropagation();\n // 删除标签\n navStore.deleteTabs(key);\n // 重新push已打开的路由\n router.push(navTabs.value[navTabs.value.length - 1].fullPath);\n\n //根据name 删除缓存的组件\n // if (rs.name) {\n // keepAliveStore.deleteKeepAlive(rs.name);\n // }\n};\n\n/**\n * 是否显示标签关闭按钮函数\n * @param item\n * 根据item和当前 navTabs 长度来判断是否要隐藏关闭标签按钮\n */\nconst closeStatus = (item: any) => {\n // 如果meta有设置keepOpen或者当前打开的标签只有一个的话不显示关闭按钮\n if (item.meta?.keepOpen) {\n return false;\n } else {\n // 如果只有一个标签,则隐藏关闭按钮\n return navTabs.value.length === 1 ? false : true;\n }\n};\n</script>\n<template>\n <div :class=\"baseClassName\">\n <a-tabs v-model:activeKey=\"activeKey\" type=\"card\" @tabClick=\"onClick\">\n <a-tab-pane v-for=\"item in navTabs\" :key=\"item.path\">\n <template #tab>\n <div class=\"tab-dividers\"></div>\n <div class=\"tab-item\" :class=\"{ active: activeKey === item.path }\">\n {{ item.meta.title }}\n </div>\n <div v-if=\"closeStatus(item)\" class=\"tab-close\">\n <CloseOutlined @click=\"onClose($event, item.fullPath)\" />\n </div>\n </template>\n </a-tab-pane>\n </a-tabs>\n </div>\n</template>\n<style lang=\"scss\"></style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiBA,IAAA,MAAM,QAAQ,QAAS,EAAA,CAAA;AACvB,IAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AAEzB,IAAA,MAAM,WAAW,eAAgB,EAAA,CAAA;AACjC,IAAA,MAAM,iBAAiB,iBAAkB,EAAA,CAAA;AACzC,IAAA,MAAM,YAAY,YAAa,EAAA,CAAA;AAG/B,IAAM,MAAA,aAAA,GAAgB,GAAG,UAAU,CAAA,IAAA,CAAA,CAAA;AAGnC,IAAA,MAAM,OAAsB,GAAA,QAAA,CAAS,MAAM,QAAA,CAAS,OAAO,CAAA,CAAA;AAE3D,IAAA,MAAM,EAAE,gBAAA,EAAqB,GAAA,WAAA,CAAY,SAAS,CAAA,CAAA;AAElD,IAAM,MAAA,SAAA,GAAY,IAAI,EAAE,CAAA,CAAA;AACxB,IAAA,WAAA,CAAY,MAAM;AAChB,MAAU,SAAA,CAAA,KAAA,GACR,iBAAiB,KAAM,CAAA,MAAA,GAAS,IAAI,gBAAiB,CAAA,KAAA,CAAM,CAAC,CAAI,GAAA,EAAA,CAAA;AAAA,KACnE,CAAA,CAAA;AAED,IAAW,UAAA,EAAA,CAAA;AAEX,IAAA,KAAA;AAAA,MACE,MAAM,KAAM,CAAA,IAAA;AAAA,MACZ,MAAM;AAEJ,QAAW,UAAA,EAAA,CAAA;AAAA,OACb;AAAA,KACF,CAAA;AAGA,IAAA,SAAS,UAAa,GAAA;AAEpB,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAA;AAGnB,MAAiB,gBAAA,CAAA,KAAA,GAAQ,CAAC,KAAA,CAAM,IAAI,CAAA,CAAA;AACpC,MAAA,cAAA,CAAe,KAAK,KAAK,CAAA,CAAA;AAAA,KAC3B;AAMA,IAAM,MAAA,OAAA,GAAU,CAAC,GAAgB,KAAA;AAC/B,MAAI,IAAA,GAAA,KAAQ,MAAM,IAAM,EAAA;AAEtB,QAAM,MAAA,EAAA,GAAK,OAAQ,CAAA,KAAA,CAAM,MAAO,CAAA,CAAC,SAAc,IAAK,CAAA,IAAA,KAAS,GAAG,CAAA,CAAE,CAAC,CAAA,CAAA;AAEnE,QAAA,MAAA,CAAO,IAAK,CAAA;AAAA,UACV,MAAM,EAAG,CAAA,IAAA;AAAA,UACT,OAAO,EAAG,CAAA,KAAA;AAAA,UACV,QAAQ,EAAG,CAAA,MAAA;AAAA,UACX,UAAU,EAAG,CAAA,QAAA;AAAA,SACP,CAAA,CAAA;AAAA,OACV;AAAA,KACF,CAAA;AAOA,IAAM,MAAA,OAAA,GAAU,CAAC,MAAA,EAAa,GAAgB,KAAA;AAG5C,MAAA,MAAA,CAAO,eAAgB,EAAA,CAAA;AAEvB,MAAA,QAAA,CAAS,WAAW,GAAG,CAAA,CAAA;AAEvB,MAAO,MAAA,CAAA,IAAA,CAAK,QAAQ,KAAM,CAAA,OAAA,CAAQ,MAAM,MAAS,GAAA,CAAC,EAAE,QAAQ,CAAA,CAAA;AAAA,KAM9D,CAAA;AAOA,IAAM,MAAA,WAAA,GAAc,CAAC,IAAc,KAAA;;AAEjC,MAAI,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,IAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAW,QAAU,EAAA;AACvB,QAAO,OAAA,KAAA,CAAA;AAAA,OACF,MAAA;AAEL,QAAA,OAAO,OAAQ,CAAA,KAAA,CAAM,MAAW,KAAA,CAAA,GAAI,KAAQ,GAAA,IAAA,CAAA;AAAA,OAC9C;AAAA,KACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"NavTabs.vue2.mjs","sources":["../../../src/layout/NavTabs.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * 标签组件\n */\nimport { computed, Ref, watch } from \"vue\";\nimport { useRoute, useRouter } from \"vue-router\";\nimport { CloseOutlined } from \"@ant-design/icons-vue\";\nimport { storeToRefs } from \"pinia\";\n\nimport {\n useNavTabsStore,\n useKeepAliveStore,\n} from \"@ditari/store\";\n\nimport { prefixName } from \"../theme\";\n\nconst route = useRoute();\nconst router = useRouter();\n\nconst navStore = useNavTabsStore();\nconst keepAliveStore = useKeepAliveStore();\nconst { activeKey } = storeToRefs(navStore);\n//class名称\nconst baseClassName = `${prefixName}-nav`;\n\n//标签列表\nconst navTabs: Ref<any[]> = computed(() => navStore.getList);\n//当前被激活的标签 通过选中的菜单得到\nwatch(\n () => route.fullPath,\n (val) => {\n setNavTabs();\n activeKey.value = val;\n },\n {\n immediate: true\n }\n);\n//首次进入页面或者刷新的时候执行\nsetNavTabs();\n\n//设置标签\nfunction setNavTabs() {\n // 保存标签\n navStore.save(route);\n // 存储路由缓存\n keepAliveStore.save(route);\n}\n\n/**\n * 切换标签\n * @param nav\n */\nconst onClick = (key: string) => {\n if (key !== route.path) {\n // 匹配打开的标签路由数据\n const rs = navTabs.value.filter((item: any) => item.path === key)[0];\n // 打开路由\n router.push({\n path: rs.path,\n query: rs.query,\n params: rs.params,\n fullPath: rs.fullPath\n } as any);\n }\n};\n\n/**\n * 关闭标签\n * @param $event\n * @param targetKey\n */\nconst onClose = ($event: any, key: string) => {\n //const rs = navTabs.value.find((item) => item.fullPath === key) as any;\n //阻止冒泡\n $event.stopPropagation();\n // 删除标签\n navStore.deleteTabs(key);\n // 重新push已打开的路由\n router.push(navTabs.value[navTabs.value.length - 1].fullPath);\n\n //根据name 删除缓存的组件\n // if (rs.name) {\n // keepAliveStore.deleteKeepAlive(rs.name);\n // }\n};\n\n/**\n * 是否显示标签关闭按钮函数\n * @param item\n * 根据item和当前 navTabs 长度来判断是否要隐藏关闭标签按钮\n */\nconst closeStatus = (item: any) => {\n // 如果meta有设置keepOpen或者当前打开的标签只有一个的话不显示关闭按钮\n if (item.meta?.keepOpen) {\n return false;\n } else {\n // 如果只有一个标签,则隐藏关闭按钮\n return navTabs.value.length === 1 ? false : true;\n }\n};\n</script>\n<template>\n <div :class=\"baseClassName\">\n <a-tabs v-model:activeKey=\"activeKey\" type=\"card\" @tabClick=\"onClick\">\n <a-tab-pane v-for=\"item in navTabs\" :key=\"item.path\">\n <template #tab>\n <div class=\"tab-dividers\"></div>\n <div class=\"tab-item\" :class=\"{ active: activeKey === item.path }\">\n {{ item.meta.title }}\n </div>\n <div v-if=\"closeStatus(item)\" class=\"tab-close\">\n <CloseOutlined @click=\"onClose($event, item.fullPath)\" />\n </div>\n </template>\n </a-tab-pane>\n </a-tabs>\n </div>\n</template>\n<style lang=\"scss\"></style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgBA,IAAA,MAAM,QAAQ,QAAS,EAAA,CAAA;AACvB,IAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AAEzB,IAAA,MAAM,WAAW,eAAgB,EAAA,CAAA;AACjC,IAAA,MAAM,iBAAiB,iBAAkB,EAAA,CAAA;AACzC,IAAA,MAAM,EAAE,SAAA,EAAc,GAAA,WAAA,CAAY,QAAQ,CAAA,CAAA;AAE1C,IAAM,MAAA,aAAA,GAAgB,GAAG,UAAU,CAAA,IAAA,CAAA,CAAA;AAGnC,IAAA,MAAM,OAAsB,GAAA,QAAA,CAAS,MAAM,QAAA,CAAS,OAAO,CAAA,CAAA;AAE3D,IAAA,KAAA;AAAA,MACE,MAAM,KAAM,CAAA,QAAA;AAAA,MACZ,CAAC,GAAQ,KAAA;AACP,QAAW,UAAA,EAAA,CAAA;AACX,QAAA,SAAA,CAAU,KAAQ,GAAA,GAAA,CAAA;AAAA,OACpB;AAAA,MACA;AAAA,QACE,SAAW,EAAA,IAAA;AAAA,OACb;AAAA,KACF,CAAA;AAEA,IAAW,UAAA,EAAA,CAAA;AAGX,IAAA,SAAS,UAAa,GAAA;AAEpB,MAAA,QAAA,CAAS,KAAK,KAAK,CAAA,CAAA;AAEnB,MAAA,cAAA,CAAe,KAAK,KAAK,CAAA,CAAA;AAAA,KAC3B;AAMA,IAAM,MAAA,OAAA,GAAU,CAAC,GAAgB,KAAA;AAC/B,MAAI,IAAA,GAAA,KAAQ,MAAM,IAAM,EAAA;AAEtB,QAAM,MAAA,EAAA,GAAK,OAAQ,CAAA,KAAA,CAAM,MAAO,CAAA,CAAC,SAAc,IAAK,CAAA,IAAA,KAAS,GAAG,CAAA,CAAE,CAAC,CAAA,CAAA;AAEnE,QAAA,MAAA,CAAO,IAAK,CAAA;AAAA,UACV,MAAM,EAAG,CAAA,IAAA;AAAA,UACT,OAAO,EAAG,CAAA,KAAA;AAAA,UACV,QAAQ,EAAG,CAAA,MAAA;AAAA,UACX,UAAU,EAAG,CAAA,QAAA;AAAA,SACP,CAAA,CAAA;AAAA,OACV;AAAA,KACF,CAAA;AAOA,IAAM,MAAA,OAAA,GAAU,CAAC,MAAA,EAAa,GAAgB,KAAA;AAG5C,MAAA,MAAA,CAAO,eAAgB,EAAA,CAAA;AAEvB,MAAA,QAAA,CAAS,WAAW,GAAG,CAAA,CAAA;AAEvB,MAAO,MAAA,CAAA,IAAA,CAAK,QAAQ,KAAM,CAAA,OAAA,CAAQ,MAAM,MAAS,GAAA,CAAC,EAAE,QAAQ,CAAA,CAAA;AAAA,KAM9D,CAAA;AAOA,IAAM,MAAA,WAAA,GAAc,CAAC,IAAc,KAAA;;AAEjC,MAAI,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,IAAL,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAW,QAAU,EAAA;AACvB,QAAO,OAAA,KAAA,CAAA;AAAA,OACF,MAAA;AAEL,QAAA,OAAO,OAAQ,CAAA,KAAA,CAAM,MAAW,KAAA,CAAA,GAAI,KAAQ,GAAA,IAAA,CAAA;AAAA,OAC9C;AAAA,KACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import("vue").DefineComponent<{}, () => JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
2
+ export default _default;
@@ -0,0 +1,136 @@
1
+ import { isVNode, defineComponent, inject, watch, createVNode, Fragment, resolveComponent, withDirectives, vShow, h } from 'vue';
2
+ import { useRouter, useRoute } from 'vue-router';
3
+ import { storeToRefs } from 'pinia';
4
+ import { useMenuStore, useSettingsStore } from '@ditari/store';
5
+
6
+ function _isSlot(s) {
7
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
8
+ }
9
+ var Menu_bak = /* @__PURE__ */ defineComponent({
10
+ name: "DMenu",
11
+ setup() {
12
+ const router = useRouter();
13
+ const route = useRoute();
14
+ const {
15
+ componentName,
16
+ prop: menuProp
17
+ } = inject("menuIcon");
18
+ const menuStore = useMenuStore();
19
+ const {
20
+ list,
21
+ openMenusKeys,
22
+ selectedMenuKeys
23
+ } = storeToRefs(menuStore);
24
+ const settingsStore = useSettingsStore();
25
+ const {
26
+ getCollapsed
27
+ } = storeToRefs(settingsStore);
28
+ watch(() => selectedMenuKeys.value, (newValue) => {
29
+ if (getCollapsed.value) {
30
+ return;
31
+ }
32
+ const activatedUrl = newValue.length > 0 ? newValue[0] : "";
33
+ const parentUrls = getParentUrls(list.value, activatedUrl);
34
+ openMenusKeys.value = parentUrls || [];
35
+ }, {
36
+ deep: true
37
+ });
38
+ function getParentUrls(menus, url) {
39
+ for (let i = 0; i < menus.length; i++) {
40
+ if (menus[i].url === url || url.startsWith(menus[i].url)) {
41
+ return [menus[i].url];
42
+ } else if (menus[i].children && menus[i].children.length > 0) {
43
+ const parentUrls = getParentUrls(menus[i].children, url);
44
+ if (parentUrls) {
45
+ return [menus[i].url, ...parentUrls];
46
+ }
47
+ }
48
+ }
49
+ return null;
50
+ }
51
+ const onClick = ({
52
+ key,
53
+ keyPath
54
+ }) => {
55
+ var _a;
56
+ openMenusKeys.value = keyPath;
57
+ selectedMenuKeys.value = [key];
58
+ const findRoute = router.getRoutes().find((item) => item.path === key && item.components);
59
+ if (((_a = findRoute == null ? void 0 : findRoute.meta) == null ? void 0 : _a.open) === "_blank") {
60
+ window.open(window.location.origin + key, "_blank");
61
+ } else {
62
+ route.path !== key ? router.push(key).then((r) => r ? console.warn(r) : null) : null;
63
+ }
64
+ };
65
+ const renderMenu = (menu) => {
66
+ return createVNode(Fragment, null, [createVNode(resolveComponent("a-menu-item"), {
67
+ "key": menu.url
68
+ }, {
69
+ icon: () => renderIcon(menu),
70
+ default: () => menu.title
71
+ })]);
72
+ };
73
+ const iconClass = ["anticon", "anticon-menu", "ant-menu-item-icon"];
74
+ const renderIcon = (menu) => {
75
+ return createVNode(Fragment, null, [!menu.icon ? withDirectives(createVNode("div", {
76
+ "class": iconClass
77
+ }, [menu.title.substring(0, 1)]), [[vShow, getCollapsed.value]]) : renderIconSwitch(menu.icon)]);
78
+ };
79
+ const renderIconSwitch = (icon) => {
80
+ if (componentName === "nativeHtml") {
81
+ return createVNode("span", {
82
+ "innerHTML": icon
83
+ }, null);
84
+ } else {
85
+ return h(resolveComponent(componentName), {
86
+ [`${menuProp}`]: icon
87
+ });
88
+ }
89
+ };
90
+ const renderSub = (menu) => {
91
+ return createVNode(Fragment, null, [createVNode(resolveComponent("a-sub-menu"), {
92
+ "key": menu.url
93
+ }, {
94
+ title: () => menu.title,
95
+ icon: () => renderIcon(menu),
96
+ default: () => {
97
+ return menu.children.map(
98
+ (item) => !item.children || item.children.length === 0 ? renderSubMenu(item) : renderSub(item)
99
+ // 递归调用
100
+ );
101
+ }
102
+ })]);
103
+ };
104
+ const renderSubMenu = (menu) => {
105
+ return createVNode(Fragment, null, [createVNode(resolveComponent("a-menu-item"), {
106
+ "key": menu.url
107
+ }, {
108
+ default: () => menu.title
109
+ })]);
110
+ };
111
+ return () => {
112
+ let _slot;
113
+ return createVNode(Fragment, null, [createVNode(resolveComponent("a-menu"), {
114
+ "mode": "inline",
115
+ "theme": "dark",
116
+ "openKeys": openMenusKeys.value,
117
+ "onUpdate:openKeys": ($event) => openMenusKeys.value = $event,
118
+ "selectedKeys": selectedMenuKeys.value,
119
+ "onUpdate:selectedKeys": ($event) => selectedMenuKeys.value = $event,
120
+ "onClick": onClick
121
+ }, _isSlot(_slot = list.value.map((menu) => {
122
+ var _a;
123
+ if (!menu.children || ((_a = menu.children) == null ? void 0 : _a.length) === 0) {
124
+ return renderMenu(menu);
125
+ } else {
126
+ return renderSub(menu);
127
+ }
128
+ })) ? _slot : {
129
+ default: () => [_slot]
130
+ })]);
131
+ };
132
+ }
133
+ });
134
+
135
+ export { Menu_bak as default };
136
+ //# sourceMappingURL=Menu.bak.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.bak.mjs","sources":["../../../src/menu/Menu.bak.tsx"],"sourcesContent":["import { defineComponent, h, inject, resolveComponent, watch } from \"vue\";\nimport { useRouter, useRoute } from \"vue-router\";\n\nimport { storeToRefs } from \"pinia\";\n\nimport { useMenuStore, useSettingsStore } from \"@ditari/store\";\n\nexport default defineComponent({\n name: \"DMenu\",\n setup() {\n const router = useRouter();\n const route = useRoute();\n const { componentName, prop: menuProp } = inject(\"menuIcon\") as any;\n // 菜单store\n const menuStore = useMenuStore();\n const { list, openMenusKeys, selectedMenuKeys } = storeToRefs(menuStore);\n // 设置store\n const settingsStore = useSettingsStore();\n const { getCollapsed } = storeToRefs(settingsStore) as any;\n\n // watchEffect(() => {\n // if (getCollapsed.value) {\n // // 如果菜单是收缩的状态,则不匹配激活的菜单\n // // 否则 在切换标签的时候,收缩菜单会自动激活悬浮的动作\n // return;\n // }\n // // 会被触发两次\n // // 当前激活的url\n // const activatedUrl =\n // selectedMenuKeys.value.length > 0 ? selectedMenuKeys.value[0] : \"\";\n // const parentUrls = getParentUrls(list.value, activatedUrl);\n // openMenusKeys.value = parentUrls || [];\n // });\n\n watch(\n () => selectedMenuKeys.value,\n (newValue: any) => {\n if (getCollapsed.value) {\n // 如果菜单是收缩的状态,则不匹配激活的菜单\n // 否则 在切换标签的时候,收缩菜单会自动激活悬浮的动作\n return;\n }\n const activatedUrl = newValue.length > 0 ? newValue[0] : \"\";\n const parentUrls = getParentUrls(list.value, activatedUrl);\n openMenusKeys.value = parentUrls || [];\n },\n {\n deep: true\n }\n );\n\n function getParentUrls(menus: any, url: any) {\n for (let i = 0; i < menus.length; i++) {\n if (menus[i].url === url || url.startsWith(menus[i].url)) {\n // 如果当前菜单项的url与传入的url相等,说明找到了当前菜单项\n return [menus[i].url];\n } else if (menus[i].children && menus[i].children.length > 0) {\n // 如果当前菜单项有子菜单,则递归查找子菜单\n const parentUrls: any = getParentUrls(menus[i].children, url);\n if (parentUrls) {\n // 如果子菜单中存在当前url,则将当前菜单项的url添加到返回结果中\n return [menus[i].url, ...parentUrls];\n }\n }\n }\n return null;\n }\n\n /**\n * 监听菜单点击事件\n * @param item\n * @param key\n * @param keyPath\n */\n const onClick = ({ key, keyPath }: any) => {\n openMenusKeys.value = keyPath;\n selectedMenuKeys.value = [key];\n const findRoute = router\n .getRoutes()\n .find((item) => item.path === key && item.components);\n // 判断目标路由和当前路由是否相等\n // 不相等的时候再跳转\n if (findRoute?.meta?.open === \"_blank\") {\n window.open(window.location.origin + key, \"_blank\");\n } else {\n route.path !== key\n ? router.push(key).then((r) => (r ? console.warn(r) : null))\n : null;\n }\n };\n\n // 渲染菜单\n const renderMenu = (menu: any) => {\n return (\n <>\n <a-menu-item key={menu.url}>\n {{\n icon: () => renderIcon(menu),\n default: () => menu.title\n }}\n </a-menu-item>\n </>\n );\n };\n\n const iconClass = [\"anticon\", \"anticon-menu\", \"ant-menu-item-icon\"];\n // 渲染图标\n const renderIcon = (menu: any) => {\n return (\n <>\n {!menu.icon ? (\n <div v-show={getCollapsed.value} class={iconClass}>\n {menu.title.substring(0, 1)}\n </div>\n ) : (\n renderIconSwitch(menu.icon)\n )}\n </>\n );\n };\n\n const renderIconSwitch = (icon: any) => {\n if (componentName === \"nativeHtml\") {\n return <span v-html={icon}></span>;\n } else {\n return h(resolveComponent(componentName), {\n [`${menuProp}`]: icon\n });\n }\n };\n\n // 递归渲染子菜单\n const renderSub = (menu: any) => {\n return (\n <>\n <a-sub-menu key={menu.url}>\n {{\n title: () => menu.title,\n icon: () => renderIcon(menu),\n default: () => {\n return menu.children.map(\n (item: any) =>\n !item.children || item.children.length === 0\n ? renderSubMenu(item)\n : renderSub(item) // 递归调用\n );\n }\n }}\n </a-sub-menu>\n </>\n );\n };\n\n // 递归下的子菜单\n const renderSubMenu = (menu: any) => {\n return (\n <>\n <a-menu-item key={menu.url}>\n {{\n default: () => menu.title\n }}\n </a-menu-item>\n </>\n );\n };\n\n return () => (\n <>\n <a-menu\n mode=\"inline\"\n theme=\"dark\"\n v-model:openKeys={openMenusKeys.value}\n v-model:selectedKeys={selectedMenuKeys.value}\n onClick={onClick}\n >\n {list.value.map((menu: any) => {\n if (!menu.children || menu.children?.length === 0) {\n // 没有children属性或者children的长度等于0\n return renderMenu(menu);\n } else {\n return renderSub(menu);\n }\n })}\n </a-menu>\n </>\n );\n }\n});\n"],"names":["_isSlot","s","Object","prototype","toString","call","_isVNode","name","setup","router","useRouter","route","useRoute","componentName","prop","menuProp","inject","menuStore","useMenuStore","list","openMenusKeys","selectedMenuKeys","storeToRefs","settingsStore","useSettingsStore","getCollapsed","watch","value","newValue","activatedUrl","length","parentUrls","getParentUrls","deep","menus","url","i","startsWith","children","onClick","key","keyPath","findRoute","getRoutes","find","item","path","components","meta","open","window","location","origin","push","then","r","console","warn","renderMenu","menu","_createVNode","_Fragment","_resolveComponent","icon","renderIcon","default","title","iconClass","_withDirectives","substring","_vShow","renderIconSwitch","h","resolveComponent","renderSub","map","renderSubMenu","_slot","$event"],"mappings":"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"}
@@ -2,7 +2,28 @@ import { isVNode, defineComponent, inject, watch, createVNode, Fragment, resolve
2
2
  import { useRouter, useRoute } from 'vue-router';
3
3
  import { storeToRefs } from 'pinia';
4
4
  import { useMenuStore, useSettingsStore } from '@ditari/store';
5
+ import useMenuCore from './useMenuCore.mjs';
5
6
 
7
+ var __async = (__this, __arguments, generator) => {
8
+ return new Promise((resolve, reject) => {
9
+ var fulfilled = (value) => {
10
+ try {
11
+ step(generator.next(value));
12
+ } catch (e) {
13
+ reject(e);
14
+ }
15
+ };
16
+ var rejected = (value) => {
17
+ try {
18
+ step(generator.throw(value));
19
+ } catch (e) {
20
+ reject(e);
21
+ }
22
+ };
23
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
24
+ step((generator = generator.apply(__this, __arguments)).next());
25
+ });
26
+ };
6
27
  function _isSlot(s) {
7
28
  return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
8
29
  }
@@ -15,6 +36,10 @@ var Menu = /* @__PURE__ */ defineComponent({
15
36
  componentName,
16
37
  prop: menuProp
17
38
  } = inject("menuIcon");
39
+ const {
40
+ findMatchedMenuById,
41
+ findMenuItemByUrl
42
+ } = useMenuCore();
18
43
  const menuStore = useMenuStore();
19
44
  const {
20
45
  list,
@@ -25,45 +50,95 @@ var Menu = /* @__PURE__ */ defineComponent({
25
50
  const {
26
51
  getCollapsed
27
52
  } = storeToRefs(settingsStore);
28
- watch(() => selectedMenuKeys.value, (newValue) => {
29
- if (getCollapsed.value) {
30
- return;
31
- }
32
- const activatedUrl = newValue.length > 0 ? newValue[0] : "";
33
- const parentUrls = getParentUrls(list.value, activatedUrl);
34
- openMenusKeys.value = parentUrls || [];
35
- }, {
36
- deep: true
37
- });
38
- function getParentUrls(menus, url) {
39
- for (let i = 0; i < menus.length; i++) {
40
- if (menus[i].url === url || url.startsWith(menus[i].url)) {
41
- return [menus[i].url];
42
- } else if (menus[i].children && menus[i].children.length > 0) {
43
- const parentUrls = getParentUrls(menus[i].children, url);
44
- if (parentUrls) {
45
- return [menus[i].url, ...parentUrls];
53
+ useMenu();
54
+ function useMenu() {
55
+ watch(() => route.fullPath, (path) => __async(this, null, function* () {
56
+ const flag = selectedMenuKeys.value.some((item) => item === path);
57
+ if (!flag) {
58
+ let menuItem = findMenuItemByUrl(path, list.value);
59
+ if (!menuItem) {
60
+ menuItem = findClosestParentMenu(path, list.value);
61
+ }
62
+ if (!menuItem) {
63
+ openMenusKeys.value = [];
64
+ selectedMenuKeys.value = [path];
65
+ } else {
66
+ const rs = getFullParentChain(menuItem.id, list.value);
67
+ if (!getCollapsed.value) {
68
+ openMenusKeys.value = rs;
69
+ }
70
+ selectedMenuKeys.value = [menuItem.key];
46
71
  }
47
72
  }
48
- }
49
- return null;
73
+ }));
74
+ watch(() => getCollapsed.value, (val) => {
75
+ const id = selectedMenuKeys.value[0];
76
+ const rs = findMatchedMenuById(id, list.value);
77
+ if (val) {
78
+ openMenusKeys.value = [];
79
+ } else {
80
+ if (rs == null ? void 0 : rs.parentItem) {
81
+ openMenusKeys.value = [rs.parentItem.key];
82
+ } else {
83
+ openMenusKeys.value = [rs.matchItem.key];
84
+ }
85
+ }
86
+ });
87
+ const findClosestParentMenu = (url, menus) => {
88
+ const cleanUrl = url.split("?")[0].split("#")[0];
89
+ const pathSegments = cleanUrl.split("/").filter(Boolean);
90
+ for (let i = pathSegments.length; i > 0; i--) {
91
+ const testPath = "/" + pathSegments.slice(0, i).join("/");
92
+ const foundItem = findMenuItemByUrl(testPath, menus);
93
+ if (foundItem)
94
+ return foundItem;
95
+ }
96
+ return null;
97
+ };
98
+ const getFullParentChain = (targetId, menus, parentChain = []) => {
99
+ var _a;
100
+ for (const menu of menus) {
101
+ if (menu.id === targetId) {
102
+ return [...parentChain, menu.key];
103
+ }
104
+ if ((_a = menu.children) == null ? void 0 : _a.length) {
105
+ const result = getFullParentChain(
106
+ targetId,
107
+ menu.children,
108
+ [...parentChain, menu.key]
109
+ // 传递当前层级的 key
110
+ );
111
+ if (result)
112
+ return result;
113
+ }
114
+ }
115
+ return null;
116
+ };
50
117
  }
51
118
  const onClick = ({
52
119
  key,
53
120
  keyPath
54
121
  }) => {
55
- var _a;
56
- openMenusKeys.value = keyPath;
57
- selectedMenuKeys.value = [key];
58
- if (((_a = route.meta) == null ? void 0 : _a.open) === "_blank") {
59
- window.open(window.location.origin + route.path, "_blank");
122
+ var _a, _b, _c, _d;
123
+ const rs = findMatchedMenuById(key, list.value);
124
+ const findRoute = router.getRoutes().find((item) => item.path === rs.matchItem.url && item.components);
125
+ if (((_a = findRoute == null ? void 0 : findRoute.meta) == null ? void 0 : _a.open) === "_blank") {
126
+ window.open(window.location.origin + rs.matchItem.url, "_blank");
60
127
  } else {
61
- route.path !== key ? router.push(key).then((r) => r ? console.warn(r) : null) : null;
128
+ openMenusKeys.value = keyPath;
129
+ selectedMenuKeys.value = [(_b = rs.matchItem) == null ? void 0 : _b.key];
130
+ if (((_c = rs.matchItem) == null ? void 0 : _c.url) !== route.path) {
131
+ router.push((_d = rs.matchItem) == null ? void 0 : _d.url).then((r) => {
132
+ if (r) {
133
+ console.warn(r);
134
+ }
135
+ });
136
+ }
62
137
  }
63
138
  };
64
139
  const renderMenu = (menu) => {
65
140
  return createVNode(Fragment, null, [createVNode(resolveComponent("a-menu-item"), {
66
- "key": menu.url
141
+ "key": menu.key
67
142
  }, {
68
143
  icon: () => renderIcon(menu),
69
144
  default: () => menu.title
@@ -88,7 +163,7 @@ var Menu = /* @__PURE__ */ defineComponent({
88
163
  };
89
164
  const renderSub = (menu) => {
90
165
  return createVNode(Fragment, null, [createVNode(resolveComponent("a-sub-menu"), {
91
- "key": menu.url
166
+ "key": menu.key
92
167
  }, {
93
168
  title: () => menu.title,
94
169
  icon: () => renderIcon(menu),
@@ -102,7 +177,7 @@ var Menu = /* @__PURE__ */ defineComponent({
102
177
  };
103
178
  const renderSubMenu = (menu) => {
104
179
  return createVNode(Fragment, null, [createVNode(resolveComponent("a-menu-item"), {
105
- "key": menu.url
180
+ "key": menu.key
106
181
  }, {
107
182
  default: () => menu.title
108
183
  })]);