@@ -68,6 +68,9 @@ export interface MenuProps
6868
6969export interface MenuState {
7070 switchingModeFromInline : boolean ;
71+ prevProps : MenuProps ;
72+ inlineOpenKeys : Array < string > ;
73+ store : MiniStore ;
7174}
7275
7376class Menu extends React . Component < MenuProps , MenuState > {
@@ -112,6 +115,9 @@ class Menu extends React.Component<MenuProps, MenuState> {
112115
113116 this . state = {
114117 switchingModeFromInline : false ,
118+ prevProps : props ,
119+ inlineOpenKeys : [ ] ,
120+ store : this . store ,
115121 } ;
116122 }
117123
@@ -121,64 +127,64 @@ class Menu extends React.Component<MenuProps, MenuState> {
121127
122128 innerMenu : typeof SubPopupMenu ;
123129
124- inlineOpenKeys : string [ ] = [ ] ;
125-
126130 prevOpenKeys : string [ ] ;
127131
128- componentDidMount ( ) {
129- this . updateMiniStore ( ) ;
130- this . updateMenuDisplay ( ) ;
131- }
132-
133- componentDidUpdate ( prevProps : MenuProps ) {
134- this . updateOpentKeysWhenSwitchMode ( prevProps ) ;
135- this . updateMiniStore ( ) ;
136- const { siderCollapsed, inlineCollapsed, onOpenChange } = this . props ;
137- if (
138- ( ! prevProps . inlineCollapsed && inlineCollapsed ) ||
139- ( ! prevProps . siderCollapsed && siderCollapsed )
140- ) {
141- onOpenChange ( [ ] ) ;
142- }
143- this . updateMenuDisplay ( ) ;
144- }
145-
146- updateOpentKeysWhenSwitchMode ( prevProps : MenuProps ) {
147- const { props : nextProps , store, inlineOpenKeys } = this ;
148- const prevState = store . getState ( ) ;
149- const newState : any = { } ;
132+ static getDerivedStateFromProps ( nextProps : MenuProps , prevState : MenuState ) {
133+ const { prevProps, store } = prevState ;
134+ const prevStoreState = store . getState ( ) ;
135+ const newStoreState : any = { } ;
136+ const newState : Partial < MenuState > = {
137+ prevProps : nextProps ,
138+ } ;
150139 if ( prevProps . mode === 'inline' && nextProps . mode !== 'inline' ) {
151- this . setState ( {
152- switchingModeFromInline : true ,
153- } ) ;
140+ newState . switchingModeFromInline = true ;
154141 }
155142
156- if ( ! ( 'openKeys' in nextProps ) ) {
143+ if ( 'openKeys' in nextProps ) {
144+ newStoreState . openKeys = nextProps . openKeys ;
145+ } else {
157146 // [Legacy] Old code will return after `openKeys` changed.
158147 // Not sure the reason, we should keep this logic still.
159148 if (
160149 ( nextProps . inlineCollapsed && ! prevProps . inlineCollapsed ) ||
161150 ( nextProps . siderCollapsed && ! prevProps . siderCollapsed )
162151 ) {
163- this . setState ( {
164- switchingModeFromInline : true ,
165- } ) ;
166- this . inlineOpenKeys = prevState . openKeys . concat ( ) ;
167- newState . openKeys = [ ] ;
152+ newState . switchingModeFromInline = true ;
153+ newState . inlineOpenKeys = prevStoreState . openKeys ;
154+ newStoreState . openKeys = [ ] ;
168155 }
169156
170157 if (
171158 ( ! nextProps . inlineCollapsed && prevProps . inlineCollapsed ) ||
172159 ( ! nextProps . siderCollapsed && prevProps . siderCollapsed )
173160 ) {
174- newState . openKeys = inlineOpenKeys ;
175- this . inlineOpenKeys = [ ] ;
161+ newStoreState . openKeys = prevState . inlineOpenKeys ;
162+ newState . inlineOpenKeys = [ ] ;
176163 }
177164 }
178165
179- if ( Object . keys ( newState ) . length ) {
180- store . setState ( newState ) ;
166+ if ( Object . keys ( newStoreState ) . length ) {
167+ store . setState ( newStoreState ) ;
181168 }
169+
170+ return newState ;
171+ }
172+
173+ componentDidMount ( ) {
174+ this . updateMiniStore ( ) ;
175+ this . updateMenuDisplay ( ) ;
176+ }
177+
178+ componentDidUpdate ( prevProps : MenuProps ) {
179+ const { siderCollapsed, inlineCollapsed, onOpenChange } = this . props ;
180+ if (
181+ ( ! prevProps . inlineCollapsed && inlineCollapsed ) ||
182+ ( ! prevProps . siderCollapsed && siderCollapsed )
183+ ) {
184+ onOpenChange ( [ ] ) ;
185+ }
186+ this . updateMiniStore ( ) ;
187+ this . updateMenuDisplay ( ) ;
182188 }
183189
184190 updateMenuDisplay ( ) {
0 commit comments