Skip to content

Commit 48a691c

Browse files
authored
fix: fix CollapsePanel onItemClick not triggering error (#300)
* test: add case * fix: fix CollapsePanel onItemClick not triggering error
1 parent 53b6294 commit 48a691c

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

src/Collapse.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import classNames from 'classnames';
22
import toArray from 'rc-util/lib/Children/toArray';
33
import useMergedState from 'rc-util/lib/hooks/useMergedState';
44
import React from 'react';
5-
import type { CollapseProps, CollapsibleType } from './interface';
5+
import type { CollapsePanelProps, CollapseProps, CollapsibleType } from './interface';
66
import CollapsePanel from './Panel';
77

88
function getActiveKeysArray(activeKey: React.Key | React.Key[]) {
@@ -56,7 +56,7 @@ const Collapse = React.forwardRef<HTMLDivElement, CollapseProps>((props, ref) =>
5656
});
5757

5858
// ======================== Children ========================
59-
const getNewChild = (child: React.ReactElement, index: number) => {
59+
const getNewChild = (child: React.ReactElement<CollapsePanelProps>, index: number) => {
6060
if (!child) return null;
6161

6262
const key = child.key || String(index);
@@ -66,6 +66,7 @@ const Collapse = React.forwardRef<HTMLDivElement, CollapseProps>((props, ref) =>
6666
headerClass,
6767
destroyInactivePanel: childDestroyInactivePanel,
6868
collapsible: childCollapsible,
69+
onItemClick: childOnItemClick,
6970
} = child.props;
7071

7172
let isActive = false;
@@ -77,6 +78,12 @@ const Collapse = React.forwardRef<HTMLDivElement, CollapseProps>((props, ref) =>
7778

7879
const mergeCollapsible: CollapsibleType = childCollapsible ?? collapsible;
7980

81+
const handleItemClick = (value: React.Key) => {
82+
if (mergeCollapsible === 'disabled') return;
83+
onClickItem(value);
84+
childOnItemClick?.(value);
85+
};
86+
8087
const childProps = {
8188
key,
8289
panelKey: key,
@@ -88,7 +95,7 @@ const Collapse = React.forwardRef<HTMLDivElement, CollapseProps>((props, ref) =>
8895
openMotion,
8996
accordion,
9097
children: child.props.children,
91-
onItemClick: mergeCollapsible === 'disabled' ? null : onClickItem,
98+
onItemClick: handleItemClick,
9299
expandIcon,
93100
collapsible: mergeCollapsible,
94101
};

tests/index.spec.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,4 +652,31 @@ describe('collapse', () => {
652652
expect(ref.current).toBe(container.firstChild);
653653
expect(panelRef.current).toBe(container.querySelector('.rc-collapse-item'));
654654
});
655+
656+
// https://github.com/react-component/collapse/issues/235
657+
it('onItemClick should work', () => {
658+
const onItemClick = jest.fn();
659+
const { container } = render(
660+
<Collapse>
661+
<Panel header="collapse 1" key="1" onItemClick={onItemClick}>
662+
first
663+
</Panel>
664+
</Collapse>,
665+
);
666+
fireEvent.click(container.querySelector('.rc-collapse-header')!);
667+
expect(onItemClick).toHaveBeenCalled();
668+
});
669+
670+
it('onItemClick should not work when collapsible is disabled', () => {
671+
const onItemClick = jest.fn();
672+
const { container } = render(
673+
<Collapse collapsible="disabled">
674+
<Panel header="collapse 1" key="1" onItemClick={onItemClick}>
675+
first
676+
</Panel>
677+
</Collapse>,
678+
);
679+
fireEvent.click(container.querySelector('.rc-collapse-header')!);
680+
expect(onItemClick).not.toHaveBeenCalled();
681+
});
655682
});

0 commit comments

Comments
 (0)