@ditari/bsui 1.1.50 → 1.1.52
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.
- package/CHANGELOG.md +14 -0
- package/dist/cjs/layout/FuckMain.vue.d.ts +1 -19
- package/dist/cjs/layout/Main.vue.d.ts +1 -19
- package/dist/cjs/layout/NavTabs.vue.d.ts +4 -19
- package/dist/cjs/layout/NavTabs.vue2.cjs +11 -13
- package/dist/cjs/layout/NavTabs.vue2.cjs.map +1 -1
- package/dist/cjs/menu/Menu.bak.cjs +140 -0
- package/dist/cjs/menu/Menu.bak.cjs.map +1 -0
- package/dist/cjs/menu/Menu.bak.d.ts +2 -0
- package/dist/cjs/menu/Menu.cjs +103 -29
- package/dist/cjs/menu/Menu.cjs.map +1 -1
- package/dist/cjs/menu/useMenuCore.cjs +53 -0
- package/dist/cjs/menu/useMenuCore.cjs.map +1 -0
- package/dist/cjs/menu/useMenuCore.d.ts +8 -0
- package/dist/esm/layout/FuckMain.vue.d.ts +1 -19
- package/dist/esm/layout/Main.vue.d.ts +1 -19
- package/dist/esm/layout/NavTabs.vue.d.ts +4 -19
- package/dist/esm/layout/NavTabs.vue2.mjs +13 -15
- package/dist/esm/layout/NavTabs.vue2.mjs.map +1 -1
- package/dist/esm/menu/Menu.bak.d.ts +2 -0
- package/dist/esm/menu/Menu.bak.mjs +136 -0
- package/dist/esm/menu/Menu.bak.mjs.map +1 -0
- package/dist/esm/menu/Menu.mjs +103 -29
- package/dist/esm/menu/Menu.mjs.map +1 -1
- package/dist/esm/menu/useMenuCore.d.ts +8 -0
- package/dist/esm/menu/useMenuCore.mjs +49 -0
- package/dist/esm/menu/useMenuCore.mjs.map +1 -0
- package/package.json +3 -3
|
@@ -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;;;;"}
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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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"}
|
package/dist/esm/menu/Menu.mjs
CHANGED
|
@@ -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,46 +50,95 @@ var Menu = /* @__PURE__ */ defineComponent({
|
|
|
25
50
|
const {
|
|
26
51
|
getCollapsed
|
|
27
52
|
} = storeToRefs(settingsStore);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
const findRoute = router.getRoutes().find((item) => item.path === key && item.components);
|
|
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);
|
|
59
125
|
if (((_a = findRoute == null ? void 0 : findRoute.meta) == null ? void 0 : _a.open) === "_blank") {
|
|
60
|
-
window.open(window.location.origin +
|
|
126
|
+
window.open(window.location.origin + rs.matchItem.url, "_blank");
|
|
61
127
|
} else {
|
|
62
|
-
|
|
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
|
+
}
|
|
63
137
|
}
|
|
64
138
|
};
|
|
65
139
|
const renderMenu = (menu) => {
|
|
66
140
|
return createVNode(Fragment, null, [createVNode(resolveComponent("a-menu-item"), {
|
|
67
|
-
"key": menu.
|
|
141
|
+
"key": menu.key
|
|
68
142
|
}, {
|
|
69
143
|
icon: () => renderIcon(menu),
|
|
70
144
|
default: () => menu.title
|
|
@@ -89,7 +163,7 @@ var Menu = /* @__PURE__ */ defineComponent({
|
|
|
89
163
|
};
|
|
90
164
|
const renderSub = (menu) => {
|
|
91
165
|
return createVNode(Fragment, null, [createVNode(resolveComponent("a-sub-menu"), {
|
|
92
|
-
"key": menu.
|
|
166
|
+
"key": menu.key
|
|
93
167
|
}, {
|
|
94
168
|
title: () => menu.title,
|
|
95
169
|
icon: () => renderIcon(menu),
|
|
@@ -103,7 +177,7 @@ var Menu = /* @__PURE__ */ defineComponent({
|
|
|
103
177
|
};
|
|
104
178
|
const renderSubMenu = (menu) => {
|
|
105
179
|
return createVNode(Fragment, null, [createVNode(resolveComponent("a-menu-item"), {
|
|
106
|
-
"key": menu.
|
|
180
|
+
"key": menu.key
|
|
107
181
|
}, {
|
|
108
182
|
default: () => menu.title
|
|
109
183
|
})]);
|