Skip to content

Commit b8580bd

Browse files
committed
fix: MenuUtil
1 parent 2b8873d commit b8580bd

File tree

3 files changed

+17
-76
lines changed

3 files changed

+17
-76
lines changed

src/SiderMenu/BaseMenu.tsx

Lines changed: 15 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ export interface BaseMenuProps extends Partial<PureSettings>, PrivateSiderMenuPr
4444
// vue props
4545
export const baseMenuProps = {
4646
locale: Boolean,
47+
prefixCls: {
48+
type: String as PropType<string | undefined>,
49+
default: () => 'ant-pro',
50+
},
4751
i18n: {
4852
type: Function as PropType<FormatMessage>,
4953
default: (t: string): string => t,
@@ -76,70 +80,11 @@ export const baseMenuProps = {
7680
},
7781
};
7882

79-
const httpReg = /(http|https|ftp):\/\/([\w.]+\/?)\S*/;
80-
81-
const renderTitle = (title: string | undefined, i18nRender: FormatMessage) => {
82-
return <span>{(i18nRender && title && i18nRender(title)) || title}</span>;
83-
};
84-
85-
const renderMenuItem = (item: MenuDataItem, i18nRender: FormatMessage) => {
86-
const meta = Object.assign({}, item.meta);
87-
const target = meta.target || null;
88-
const hasRemoteUrl = httpReg.test(item.path);
89-
const CustomTag: any = resolveComponent((target && 'a') || 'router-link');
90-
const props = { to: { name: item.name } };
91-
const attrs = hasRemoteUrl || target ? { href: item.path, target: target } : {};
92-
if (item.children && item.meta?.hideChildInMenu) {
93-
// 把有子菜单的 并且 父菜单是要隐藏子菜单的
94-
// 都给子菜单增加一个 hidden 属性
95-
// 用来给刷新页面时, selectedKeys 做控制用
96-
item.children.forEach(cd => {
97-
cd.meta = Object.assign(cd.meta || {}, { hidden: true });
98-
});
99-
}
100-
// @ts-nocheck
101-
return (
102-
<Menu.Item key={item.path}>
103-
<CustomTag {...attrs} {...props}>
104-
<LazyIcon icon={meta.icon} />
105-
{renderTitle(meta.title, i18nRender)}
106-
</CustomTag>
107-
</Menu.Item>
108-
);
109-
};
110-
111-
const renderSubMenu = (item: MenuDataItem, i18nRender: FormatMessage) => {
112-
const renderMenuContent = (
113-
<span>
114-
<LazyIcon icon={item.meta?.icon} />
115-
<span>{renderTitle(item.meta?.title, i18nRender)}</span>
116-
</span>
117-
) as string & VNode;
118-
return (
119-
<Menu.SubMenu key={item.path} title={renderMenuContent}>
120-
{/* eslint-disable-next-line @typescript-eslint/no-use-before-define */}
121-
{!item.meta?.hideChildInMenu && item.children.map(cd => renderMenu(cd, i18nRender))}
122-
</Menu.SubMenu>
123-
);
124-
};
125-
126-
const renderMenu = (item: MenuDataItem, i18nRender: FormatMessage) => {
127-
if (item && !item.meta.hidden) {
128-
const hasChild = item.children && !item.meta?.hideChildInMenu;
129-
return hasChild ? renderSubMenu(item, i18nRender) : renderMenuItem(item, i18nRender);
130-
}
131-
return null;
132-
};
133-
13483
const IconFont = createFromIconfontCN({
13584
scriptUrl: defaultSettings.iconfontUrl,
13685
});
13786

138-
const LazyIcon = (props: {
139-
icon: VNode | string;
140-
iconPrefixes?: string;
141-
prefixCls?: string;
142-
}) => {
87+
const LazyIcon = (props: { icon: VNode | string; iconPrefixes?: string; prefixCls?: string }) => {
14388
const { icon, iconPrefixes = 'icon-', prefixCls = 'ant-pro' } = props;
14489
if (!icon) {
14590
return null;
@@ -172,18 +117,17 @@ class MenuUtil {
172117

173118
constructor(props: BaseMenuProps) {
174119
this.props = props;
120+
console.log('MenuUtil constructor', new Date());
175121
}
176122

177123
getNavMenuItems = (menusData: MenuDataItem[] = [], isChildren: boolean) => {
178124
return menusData.map(item => this.getSubMenuOrItem(item, isChildren)).filter(item => item);
179-
}
125+
};
180126

181127
getSubMenuOrItem = (item: MenuDataItem, isChildren: boolean) => {
182-
if (Array.isArray(item.children)
183-
&& item.children.length > 0
184-
&& !item?.meta?.hideInMenu) {
128+
if (Array.isArray(item.children) && item.children.length > 0 && !item?.meta?.hideInMenu) {
185129
const { prefixCls, i18n } = this.props;
186-
const menuTitle = i18n && i18n(item.meta?.title) || item.meta?.title;
130+
const menuTitle = (i18n && i18n(item.meta?.title)) || item.meta?.title;
187131
const defaultTitle = item?.meta.icon ? (
188132
<span class={`${prefixCls}-menu-item`}>
189133
{!isChildren && <LazyIcon icon={item.meta.icon} />}
@@ -210,7 +154,7 @@ class MenuUtil {
210154
{this.getMenuItem(item, isChildren)}
211155
</Menu.Item>
212156
);
213-
}
157+
};
214158

215159
getMenuItem = (item: MenuDataItem, isChildren: boolean) => {
216160
const meta = Object.assign({}, item.meta);
@@ -221,7 +165,7 @@ class MenuUtil {
221165
const attrs = hasUrl || target ? { href: item.path, target: target } : {};
222166

223167
const { prefixCls, i18n } = this.props;
224-
const menuTitle = i18n && i18n(item.meta?.title) || item.meta?.title;
168+
const menuTitle = (i18n && i18n(item.meta?.title)) || item.meta?.title;
225169
const defaultTitle = item?.meta.icon ? (
226170
<span class={`${prefixCls}-menu-item`}>
227171
<CustomTag {...attrs} {...props}>
@@ -234,7 +178,7 @@ class MenuUtil {
234178
);
235179

236180
return defaultTitle;
237-
}
181+
};
238182

239183
conversionPath = (path: string) => {
240184
if (path && path.indexOf('http') === 0) {
@@ -249,8 +193,9 @@ export default defineComponent({
249193
props: baseMenuProps,
250194
emits: ['update:openKeys', 'update:selectedKeys'],
251195
setup(props, { emit }) {
252-
const { mode, i18n } = toRefs(props);
196+
const { mode } = toRefs(props);
253197
const isInline = computed(() => mode.value === 'inline');
198+
const menuUtil = new MenuUtil(props);
254199

255200
const handleOpenChange: OpenEventHandler = (openKeys: string[]): void => {
256201
emit('update:openKeys', openKeys);
@@ -278,13 +223,7 @@ export default defineComponent({
278223
onOpenChange={handleOpenChange}
279224
onSelect={handleSelect}
280225
>
281-
{props.menuData &&
282-
props.menuData.map(menu => {
283-
if (menu.meta.hidden) {
284-
return null;
285-
}
286-
return renderMenu(menu, i18n.value);
287-
})}
226+
{menuUtil.getNavMenuItems(props.menuData, false)}
288227
</Menu>
289228
);
290229
},

src/SiderMenu/SiderMenu.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ const SiderMenu: FunctionalComponent<SiderMenuProps> = (props: SiderMenuProps) =
129129
}
130130
const defaultMenuDom = (
131131
<BaseMenu
132+
prefixCls={getPrefixCls()}
132133
theme={runtimeTheme.value === 'realDark' ? 'dark' : runtimeTheme.value}
133134
mode="inline"
134135
menuData={hasSide.value ? flatMenuData.value : context.menuData}

src/TopNavHeader/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ export const TopNavHeader: FunctionalComponent<TopNavHeaderProps> = props => {
8585
)}
8686
<div style={{ flex: 1 }} class={`${prefixCls}-menu`}>
8787
<BaseMenu
88+
prefixCls={propPrefixCls}
8889
theme={props.theme === 'realDark' ? 'dark' : props.theme}
8990
mode={props.mode}
9091
collapsed={props.collapsed}

0 commit comments

Comments
 (0)