@@ -44,6 +44,10 @@ export interface BaseMenuProps extends Partial<PureSettings>, PrivateSiderMenuPr
4444// vue props
4545export 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 = / ( h t t p | h t t p s | f t p ) : \/ \/ ( [ \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-
13483const 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 } ,
0 commit comments