Skip to content

Commit 6139fbe

Browse files
committed
fix: openKeys null crash
1 parent 2599c1c commit 6139fbe

File tree

2 files changed

+60
-43
lines changed

2 files changed

+60
-43
lines changed

src/Menu.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -219,12 +219,10 @@ const Menu: React.FC<MenuProps> = props => {
219219
disabledOverflow;
220220

221221
// ========================= Open =========================
222-
const [mergedOpenKeys, setMergedOpenKeys] = useMergedState(
223-
defaultOpenKeys || [],
224-
{
225-
value: openKeys,
226-
},
227-
);
222+
const [mergedOpenKeys, setMergedOpenKeys] = useMergedState(defaultOpenKeys, {
223+
value: openKeys,
224+
postState: keys => keys || EMPTY_LIST,
225+
});
228226

229227
// >>>>> Cache & Reset open keys when inlineCollapsed changed
230228
const [inlineCacheOpenKeys, setInlineCacheOpenKeys] = React.useState(
@@ -321,7 +319,7 @@ const Menu: React.FC<MenuProps> = props => {
321319
}
322320

323321
if (keys === null || keys === undefined) {
324-
return [];
322+
return EMPTY_LIST;
325323
}
326324

327325
return [keys];

tests/Menu.spec.js

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -233,45 +233,64 @@ describe('Menu', () => {
233233
expect(wrapper.find('li').at(1).props().className).toContain('-selected');
234234
});
235235

236-
it('can be controlled by openKeys', () => {
237-
const wrapper = mount(
238-
<Menu openKeys={['g1']}>
239-
<Menu.SubMenu key="g1">
240-
<MenuItem key="1">1</MenuItem>
241-
</Menu.SubMenu>
242-
<Menu.SubMenu key="g2">
243-
<MenuItem key="2">2</MenuItem>
244-
</Menu.SubMenu>
245-
</Menu>,
246-
);
236+
describe('openKeys', () => {
237+
it('can be controlled by openKeys', () => {
238+
const wrapper = mount(
239+
<Menu openKeys={['g1']}>
240+
<Menu.SubMenu key="g1">
241+
<MenuItem key="1">1</MenuItem>
242+
</Menu.SubMenu>
243+
<Menu.SubMenu key="g2">
244+
<MenuItem key="2">2</MenuItem>
245+
</Menu.SubMenu>
246+
</Menu>,
247+
);
247248

248-
expect(wrapper.find('InlineSubMenuList').first().props().open).toBeTruthy();
249-
expect(wrapper.find('InlineSubMenuList').last().props().open).toBeFalsy();
249+
expect(
250+
wrapper.find('InlineSubMenuList').first().props().open,
251+
).toBeTruthy();
252+
expect(wrapper.find('InlineSubMenuList').last().props().open).toBeFalsy();
250253

251-
wrapper.setProps({ openKeys: ['g2'] });
252-
expect(wrapper.find('InlineSubMenuList').first().props().open).toBeFalsy();
253-
expect(wrapper.find('InlineSubMenuList').last().props().open).toBeTruthy();
254-
});
254+
wrapper.setProps({ openKeys: ['g2'] });
255+
expect(
256+
wrapper.find('InlineSubMenuList').first().props().open,
257+
).toBeFalsy();
258+
expect(
259+
wrapper.find('InlineSubMenuList').last().props().open,
260+
).toBeTruthy();
261+
});
255262

256-
it('openKeys should allow to be empty', () => {
257-
const wrapper = mount(
258-
<Menu
259-
onClick={() => {}}
260-
onOpenChange={() => {}}
261-
openKeys={undefined}
262-
selectedKeys={['1']}
263-
mode="inline"
264-
>
265-
<SubMenu title="1231">
266-
<MenuItem>
267-
<a>
268-
<span>123123</span>
269-
</a>
270-
</MenuItem>
271-
</SubMenu>
272-
</Menu>,
273-
);
274-
expect(wrapper).toBeTruthy();
263+
it('openKeys should allow to be empty', () => {
264+
const wrapper = mount(
265+
<Menu
266+
onClick={() => {}}
267+
onOpenChange={() => {}}
268+
openKeys={undefined}
269+
selectedKeys={['1']}
270+
mode="inline"
271+
>
272+
<SubMenu title="1231">
273+
<MenuItem>
274+
<a>
275+
<span>123123</span>
276+
</a>
277+
</MenuItem>
278+
</SubMenu>
279+
</Menu>,
280+
);
281+
expect(wrapper).toBeTruthy();
282+
});
283+
284+
it('null of openKeys', () => {
285+
const wrapper = mount(
286+
<Menu openKeys={null} mode="inline">
287+
<SubMenu key="bamboo" title="Bamboo">
288+
<MenuItem key="light">Light</MenuItem>
289+
</SubMenu>
290+
</Menu>,
291+
);
292+
expect(wrapper).toBeTruthy();
293+
});
275294
});
276295

277296
it('open default submenu', () => {

0 commit comments

Comments
 (0)