Skip to content

Commit bcfe97f

Browse files
authored
fix: Collapse not working using custom component as panel (#236)
1 parent b60be7c commit bcfe97f

File tree

2 files changed

+50
-4
lines changed

2 files changed

+50
-4
lines changed

src/Collapse.tsx

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import classNames from 'classnames';
44
import shallowEqual from 'shallowequal';
55
import toArray from 'rc-util/lib/Children/toArray';
66
import CollapsePanel from './Panel';
7-
import { CollapseProps, CollapsibleType } from './interface';
7+
import type { CollapseProps, CollapsibleType } from './interface';
88

99
function getActiveKeysArray(activeKey: React.Key | React.Key[]) {
1010
let currentActiveKey = activeKey;
@@ -78,18 +78,30 @@ class Collapse extends React.Component<CollapseProps, CollapseState> {
7878
if (!child) return null;
7979

8080
const { activeKey } = this.state;
81-
const { prefixCls, openMotion, accordion, destroyInactivePanel: rootDestroyInactivePanel, expandIcon, collapsible } = this.props;
81+
const {
82+
prefixCls,
83+
openMotion,
84+
accordion,
85+
destroyInactivePanel: rootDestroyInactivePanel,
86+
expandIcon,
87+
collapsible,
88+
} = this.props;
8289
// If there is no key provide, use the panel order as default key
8390
const key = child.key || String(index);
84-
const { header, headerClass, destroyInactivePanel, collapsible: childCollapsible } = child.props;
91+
const {
92+
header,
93+
headerClass,
94+
destroyInactivePanel,
95+
collapsible: childCollapsible,
96+
} = child.props;
8597
let isActive = false;
8698
if (accordion) {
8799
isActive = activeKey[0] === key;
88100
} else {
89101
isActive = activeKey.indexOf(key) > -1;
90102
}
91103

92-
const mergeCollapsible: CollapsibleType = childCollapsible ?? collapsible;
104+
const mergeCollapsible: CollapsibleType = childCollapsible ?? collapsible;
93105

94106
const props = {
95107
key,
@@ -112,6 +124,12 @@ class Collapse extends React.Component<CollapseProps, CollapseState> {
112124
return child;
113125
}
114126

127+
Object.keys(props).forEach((propName: keyof typeof props) => {
128+
if (typeof props[propName] === 'undefined') {
129+
delete props[propName];
130+
}
131+
});
132+
115133
return React.cloneElement(child, props);
116134
};
117135

tests/index.spec.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,34 @@ describe('collapse', () => {
485485
expect(collapse.find('.custom-child').getDOMNode().innerHTML).toBe('custom-child');
486486
});
487487

488+
// https://github.com/ant-design/ant-design/issues/36327
489+
// https://github.com/ant-design/ant-design/issues/6179
490+
// https://github.com/react-component/collapse/issues/73#issuecomment-323626120
491+
it('should support custom component', () => {
492+
const PanelElement = (props) => (
493+
<Panel header="collapse 1" {...props}>
494+
<p>test</p>
495+
</Panel>
496+
);
497+
const collapse = mount(
498+
<Collapse defaultActiveKey="1">
499+
<PanelElement key="1" />
500+
<Panel header="collapse 2" key="2">
501+
second
502+
</Panel>
503+
</Collapse>,
504+
);
505+
expect(collapse.find('.rc-collapse-content-active').length).toBe(1);
506+
expect(collapse.find('.rc-collapse-content').hasClass('rc-collapse-content-active')).toBe(true);
507+
expect(collapse.find('.rc-collapse-header').at(0).text()).toBe('collapse 1');
508+
expect(collapse.find('.rc-collapse-header').at(0).find('.arrow').length).toBe(1);
509+
collapse.find('.rc-collapse-header').at(0).simulate('click');
510+
expect(collapse.find('.rc-collapse-content-active').length).toBe(0);
511+
expect(collapse.find('.rc-collapse-content').hasClass('rc-collapse-content-inactive')).toBe(
512+
true,
513+
);
514+
});
515+
488516
describe('collapsible', () => {
489517
it('default', () => {
490518
const collapse = mount(

0 commit comments

Comments
 (0)