@@ -26,6 +26,7 @@ import useUUID from './hooks/useUUID';
26
26
import { PathRegisterContext , PathUserContext } from './context/PathContext' ;
27
27
import useKeyRecords , { OVERFLOW_KEY } from './hooks/useKeyRecords' ;
28
28
import { IdContext } from './context/IdContext' ;
29
+ import PrivateContext from './context/PrivateContext' ;
29
30
30
31
/**
31
32
* Menu modify after refactor:
@@ -110,6 +111,16 @@ export interface MenuProps
110
111
// >>>>> Events
111
112
onClick ?: MenuClickEventHandler ;
112
113
onOpenChange ?: ( openKeys : string [ ] ) => void ;
114
+
115
+ // >>>>> Internal
116
+ /***
117
+ * @private Only used for `pro-layout`. Do not use in your prod directly
118
+ * and we do not promise any compatibility for this.
119
+ */
120
+ _internalRenderMenuItem ?: (
121
+ originNode : React . ReactElement ,
122
+ menuItemProps : any ,
123
+ ) => React . ReactElement ;
113
124
}
114
125
115
126
interface LegacyMenuProps extends MenuProps {
@@ -184,6 +195,9 @@ const Menu: React.FC<MenuProps> = props => {
184
195
openAnimation,
185
196
openTransitionName,
186
197
198
+ // Internal
199
+ _internalRenderMenuItem,
200
+
187
201
...restProps
188
202
} = props as LegacyMenuProps ;
189
203
@@ -426,6 +440,14 @@ const Menu: React.FC<MenuProps> = props => {
426
440
setMounted ( true ) ;
427
441
} , [ ] ) ;
428
442
443
+ // ======================= Context ========================
444
+ const privateContext = React . useMemo (
445
+ ( ) => ( {
446
+ _internalRenderMenuItem,
447
+ } ) ,
448
+ [ _internalRenderMenuItem ] ,
449
+ ) ;
450
+
429
451
// ======================== Render ========================
430
452
431
453
// >>>>> Children
@@ -502,51 +524,53 @@ const Menu: React.FC<MenuProps> = props => {
502
524
503
525
// >>>>> Render
504
526
return (
505
- < IdContext . Provider value = { uuid } >
506
- < MenuContextProvider
507
- prefixCls = { prefixCls }
508
- mode = { mergedMode }
509
- openKeys = { mergedOpenKeys }
510
- rtl = { isRtl }
511
- // Disabled
512
- disabled = { disabled }
513
- // Motion
514
- motion = { mounted ? motion : null }
515
- defaultMotions = { mounted ? defaultMotions : null }
516
- // Active
517
- activeKey = { mergedActiveKey }
518
- onActive = { onActive }
519
- onInactive = { onInactive }
520
- // Selection
521
- selectedKeys = { mergedSelectKeys }
522
- // Level
523
- inlineIndent = { inlineIndent }
524
- // Popup
525
- subMenuOpenDelay = { subMenuOpenDelay }
526
- subMenuCloseDelay = { subMenuCloseDelay }
527
- forceSubMenuRender = { forceSubMenuRender }
528
- builtinPlacements = { builtinPlacements }
529
- triggerSubMenuAction = { triggerSubMenuAction }
530
- getPopupContainer = { getInternalPopupContainer }
531
- // Icon
532
- itemIcon = { itemIcon }
533
- expandIcon = { expandIcon }
534
- // Events
535
- onItemClick = { onInternalClick }
536
- onOpenChange = { onInternalOpenChange }
537
- >
538
- < PathUserContext . Provider value = { pathUserContext } >
539
- { container }
540
- </ PathUserContext . Provider >
541
-
542
- { /* Measure menu keys. Add `display: none` to avoid some developer miss use the Menu */ }
543
- < div style = { { display : 'none' } } aria-hidden >
544
- < PathRegisterContext . Provider value = { registerPathContext } >
545
- { childList }
546
- </ PathRegisterContext . Provider >
547
- </ div >
548
- </ MenuContextProvider >
549
- </ IdContext . Provider >
527
+ < PrivateContext . Provider value = { privateContext } >
528
+ < IdContext . Provider value = { uuid } >
529
+ < MenuContextProvider
530
+ prefixCls = { prefixCls }
531
+ mode = { mergedMode }
532
+ openKeys = { mergedOpenKeys }
533
+ rtl = { isRtl }
534
+ // Disabled
535
+ disabled = { disabled }
536
+ // Motion
537
+ motion = { mounted ? motion : null }
538
+ defaultMotions = { mounted ? defaultMotions : null }
539
+ // Active
540
+ activeKey = { mergedActiveKey }
541
+ onActive = { onActive }
542
+ onInactive = { onInactive }
543
+ // Selection
544
+ selectedKeys = { mergedSelectKeys }
545
+ // Level
546
+ inlineIndent = { inlineIndent }
547
+ // Popup
548
+ subMenuOpenDelay = { subMenuOpenDelay }
549
+ subMenuCloseDelay = { subMenuCloseDelay }
550
+ forceSubMenuRender = { forceSubMenuRender }
551
+ builtinPlacements = { builtinPlacements }
552
+ triggerSubMenuAction = { triggerSubMenuAction }
553
+ getPopupContainer = { getInternalPopupContainer }
554
+ // Icon
555
+ itemIcon = { itemIcon }
556
+ expandIcon = { expandIcon }
557
+ // Events
558
+ onItemClick = { onInternalClick }
559
+ onOpenChange = { onInternalOpenChange }
560
+ >
561
+ < PathUserContext . Provider value = { pathUserContext } >
562
+ { container }
563
+ </ PathUserContext . Provider >
564
+
565
+ { /* Measure menu keys. Add `display: none` to avoid some developer miss use the Menu */ }
566
+ < div style = { { display : 'none' } } aria-hidden >
567
+ < PathRegisterContext . Provider value = { registerPathContext } >
568
+ { childList }
569
+ </ PathRegisterContext . Provider >
570
+ </ div >
571
+ </ MenuContextProvider >
572
+ </ IdContext . Provider >
573
+ </ PrivateContext . Provider >
550
574
) ;
551
575
} ;
552
576
0 commit comments