@@ -21,6 +21,7 @@ import useMemoCallback from './hooks/useMemoCallback';
2121import useUUID from './hooks/useUUID' ;
2222import type {
2323 BuiltinPlacements ,
24+ Components ,
2425 ItemType ,
2526 MenuClickEventHandler ,
2627 MenuInfo ,
@@ -60,6 +61,7 @@ export interface MenuProps
6061 prefixCls ?: string ;
6162 rootClassName ?: string ;
6263 items ?: ItemType [ ] ;
64+
6365 /** @deprecated Please use `items` instead */
6466 children ?: React . ReactNode ;
6567
@@ -148,6 +150,14 @@ export interface MenuProps
148150 disabled : boolean ;
149151 } ,
150152 ) => React . ReactElement ;
153+
154+ /**
155+ * @private NEVER! EVER! USE IN PRODUCTION!!!
156+ * This is a hack API for `antd` to fix `findDOMNode` issue.
157+ * Not use it! Not accept any PR try to make it as normal API.
158+ * By zombieJ
159+ */
160+ _internalComponents ?: Components ;
151161}
152162
153163interface LegacyMenuProps extends MenuProps {
@@ -228,12 +238,20 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
228238 _internalRenderMenuItem,
229239 _internalRenderSubMenuItem,
230240
241+ _internalComponents,
242+
231243 ...restProps
232244 } = props as LegacyMenuProps ;
233245
234- const childList : React . ReactElement [ ] = React . useMemo (
235- ( ) => parseItems ( children , items , EMPTY_LIST ) ,
236- [ children , items ] ,
246+ const [ childList , measureChildList ] : [
247+ visibleChildList : React . ReactElement [ ] ,
248+ measureChildList : React . ReactElement [ ] ,
249+ ] = React . useMemo (
250+ ( ) => [
251+ parseItems ( children , items , EMPTY_LIST , _internalComponents ) ,
252+ parseItems ( children , items , EMPTY_LIST , { } ) ,
253+ ] ,
254+ [ children , items , _internalComponents ] ,
237255 ) ;
238256
239257 const [ mounted , setMounted ] = React . useState ( false ) ;
@@ -274,9 +292,8 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
274292 } ;
275293
276294 // >>>>> Cache & Reset open keys when inlineCollapsed changed
277- const [ inlineCacheOpenKeys , setInlineCacheOpenKeys ] = React . useState (
278- mergedOpenKeys ,
279- ) ;
295+ const [ inlineCacheOpenKeys , setInlineCacheOpenKeys ] =
296+ React . useState ( mergedOpenKeys ) ;
280297
281298 const mountRef = React . useRef ( false ) ;
282299
@@ -352,9 +369,10 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
352369 [ registerPath , unregisterPath ] ,
353370 ) ;
354371
355- const pathUserContext = React . useMemo ( ( ) => ( { isSubPathKey } ) , [
356- isSubPathKey ,
357- ] ) ;
372+ const pathUserContext = React . useMemo (
373+ ( ) => ( { isSubPathKey } ) ,
374+ [ isSubPathKey ] ,
375+ ) ;
358376
359377 React . useEffect ( ( ) => {
360378 refreshOverflowKeys (
@@ -653,7 +671,7 @@ const Menu = React.forwardRef<MenuRef, MenuProps>((props, ref) => {
653671 { /* Measure menu keys. Add `display: none` to avoid some developer miss use the Menu */ }
654672 < div style = { { display : 'none' } } aria-hidden >
655673 < PathRegisterContext . Provider value = { registerPathContext } >
656- { childList }
674+ { measureChildList }
657675 </ PathRegisterContext . Provider >
658676 </ div >
659677 </ MenuContextProvider >
0 commit comments