Skip to content

Commit ed5cfa5

Browse files
authored
fix: move updateOpentKeysWhenSwitchMode to getDerivedStateFromProps hook (#346)
1 parent 6a1738f commit ed5cfa5

File tree

2 files changed

+44
-38
lines changed

2 files changed

+44
-38
lines changed

src/Menu.tsx

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ export interface MenuProps
6868

6969
export interface MenuState {
7070
switchingModeFromInline: boolean;
71+
prevProps: MenuProps;
72+
inlineOpenKeys: Array<string>;
73+
store: MiniStore;
7174
}
7275

7376
class 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() {

tests/Menu.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -823,7 +823,7 @@ describe('Menu', () => {
823823
.at(0)
824824
.hasClass('rc-menu-vertical'),
825825
).toBe(true);
826-
expect(wrapper.find('ul.rc-menu-sub.rc-menu-hidden').length).toBe(1);
826+
expect(wrapper.find('ul.rc-menu-sub').length).toBe(0);
827827

828828
wrapper.setProps({ inlineCollapsed: false });
829829
jest.runAllTimers();

0 commit comments

Comments
 (0)