Skip to content

Commit 5f6d584

Browse files
authored
fix: !multiple menu should click to close (#396)
* fix: Not click to close it * test: fix test case * fix: not trigger if empty
1 parent bdf9476 commit 5f6d584

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

src/Menu.tsx

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,11 @@ const Menu: React.FC<MenuProps> = props => {
224224
postState: keys => keys || EMPTY_LIST,
225225
});
226226

227+
const triggerOpenKeys = (keys: string[]) => {
228+
setMergedOpenKeys(keys);
229+
onOpenChange?.(keys);
230+
};
231+
227232
// >>>>> Cache & Reset open keys when inlineCollapsed changed
228233
const [inlineCacheOpenKeys, setInlineCacheOpenKeys] =
229234
React.useState(mergedOpenKeys);
@@ -249,11 +254,8 @@ const Menu: React.FC<MenuProps> = props => {
249254
if (isInlineMode) {
250255
setMergedOpenKeys(inlineCacheOpenKeys);
251256
} else {
252-
const empty = [];
253-
setMergedOpenKeys(empty);
254-
255257
// Trigger open event in case its in control
256-
onOpenChange?.(empty);
258+
triggerOpenKeys(EMPTY_LIST);
257259
}
258260
}, [isInlineMode]);
259261

@@ -338,10 +340,12 @@ const Menu: React.FC<MenuProps> = props => {
338340
const exist = mergedSelectKeys.includes(targetKey);
339341
let newSelectKeys: string[];
340342

341-
if (exist) {
342-
newSelectKeys = mergedSelectKeys.filter(key => key !== targetKey);
343-
} else if (multiple) {
344-
newSelectKeys = [...mergedSelectKeys, targetKey];
343+
if (multiple) {
344+
if (exist) {
345+
newSelectKeys = mergedSelectKeys.filter(key => key !== targetKey);
346+
} else {
347+
newSelectKeys = [...mergedSelectKeys, targetKey];
348+
}
345349
} else {
346350
newSelectKeys = [targetKey];
347351
}
@@ -359,6 +363,10 @@ const Menu: React.FC<MenuProps> = props => {
359363
} else {
360364
onSelect?.(selectInfo);
361365
}
366+
367+
if (!multiple && mergedOpenKeys.length) {
368+
onOpenChange?.(EMPTY_LIST);
369+
}
362370
};
363371

364372
// ========================= Open =========================
@@ -382,8 +390,7 @@ const Menu: React.FC<MenuProps> = props => {
382390
}
383391

384392
if (!shallowEqual(mergedOpenKeys, newOpenKeys)) {
385-
setMergedOpenKeys(newOpenKeys);
386-
onOpenChange?.(newOpenKeys);
393+
triggerOpenKeys(newOpenKeys);
387394
}
388395
});
389396

tests/Menu.spec.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,5 +539,32 @@ describe('Menu', () => {
539539

540540
errorSpy.mockRestore();
541541
});
542+
543+
it('Click should close Menu', async () => {
544+
jest.useFakeTimers();
545+
546+
const onOpenChange = jest.fn();
547+
548+
const wrapper = mount(
549+
<Menu openKeys={['bamboo']} mode="vertical" onOpenChange={onOpenChange}>
550+
<SubMenu key="bamboo" title="Bamboo">
551+
<MenuItem key="light">Light</MenuItem>
552+
</SubMenu>
553+
</Menu>,
554+
);
555+
556+
// Open menu
557+
await act(async () => {
558+
jest.runAllTimers();
559+
wrapper.update();
560+
});
561+
562+
wrapper.update();
563+
564+
wrapper.find('.rc-menu-item').last().simulate('click');
565+
expect(onOpenChange).toHaveBeenCalledWith([]);
566+
567+
jest.useRealTimers();
568+
});
542569
});
543570
/* eslint-enable */

0 commit comments

Comments
 (0)