Skip to content

Commit f66a489

Browse files
authored
Merge pull request #117 from springload/fix/GH110-performance-issues
Make the render-prop callbacks class instance methods of each respect…
2 parents 1d3eb6f + b585246 commit f66a489

File tree

7 files changed

+97
-63
lines changed

7 files changed

+97
-63
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
66
## Next
77

8+
### Fixed
9+
10+
* Fixes [performance issue](https://github.com/springload/react-accessible-accordion/issues/110) with not re-instantiating render-prop callbacks on each re-render.
11+
812
## [[v2.4.3]](https://github.com/springload/react-accessible-accordion/releases/tag/v2.4.3)
913

1014
### Fixed

package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-accessible-accordion",
3-
"version": "2.4.3",
3+
"version": "2.4.4-beta.1",
44
"description": "Accessible Accordion component for React",
55
"main": "dist/umd/index.js",
66
"jsnext:main": "dist/es/index.js",

src/Accordion/Accordion.wrapper.js

+8-7
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,18 @@ class AccordionWrapper extends Component<AccordionWrapperProps> {
3737
this.accordionStore.setOnChange(this.props.onChange);
3838
}
3939

40-
render() {
40+
renderAccordion = (accordionStore: AccordionContainer) => {
4141
const { accordion, onChange, ...rest } = this.props;
42+
return (
43+
<Accordion accordion={accordionStore.state.accordion} {...rest} />
44+
);
45+
};
46+
47+
render() {
4248
return (
4349
<Provider inject={[this.accordionStore]}>
4450
<Subscribe to={[AccordionContainer]}>
45-
{accordionStore => (
46-
<Accordion
47-
accordion={accordionStore.state.accordion}
48-
{...rest}
49-
/>
50-
)}
51+
{this.renderAccordion}
5152
</Subscribe>
5253
</Provider>
5354
);

src/AccordionItem/AccordionItem.wrapper.js

+15-10
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,25 @@ class AccordionItemWrapper extends Component<AccordionItemWrapperProps> {
3232

3333
static defaultProps = defaultProps;
3434

35+
renderItem = (
36+
accordionStore: AccordionContainer,
37+
itemStore: ItemContainer,
38+
) => {
39+
const { uuid } = itemStore.state;
40+
return (
41+
<AccordionItem
42+
{...this.props}
43+
uuid={uuid}
44+
accordionStore={accordionStore}
45+
/>
46+
);
47+
};
48+
3549
render() {
3650
return (
3751
<Provider inject={[this.itemContainer]}>
3852
<Subscribe to={[AccordionContainer, ItemContainer]}>
39-
{(accordionStore, itemStore) => {
40-
const { uuid } = itemStore.state;
41-
return (
42-
<AccordionItem
43-
{...this.props}
44-
uuid={uuid}
45-
accordionStore={accordionStore}
46-
/>
47-
);
48-
}}
53+
{this.renderItem}
4954
</Subscribe>
5055
</Provider>
5156
);
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,48 @@
11
// @flow
22

3-
import React from 'react';
3+
import React, { Component } from 'react';
44
import type { ElementProps } from 'react';
55

66
import { Subscribe } from 'unstated';
77
import AccordionContainer from '../AccordionContainer/AccordionContainer';
88
import ItemContainer from '../ItemContainer/ItemContainer';
99
import AccordionItemBody from './AccordionItemBody';
1010

11-
const defaultProps = {
12-
className: 'accordion__body',
13-
hideBodyClassName: 'accordion__body--hidden',
14-
};
15-
1611
type AccordionItemBodyWrapperProps = ElementProps<'div'> & {
1712
hideBodyClassName: string,
1813
};
1914

20-
const AccordionItemBodyWrapper = (props: AccordionItemBodyWrapperProps) => (
21-
<Subscribe to={[AccordionContainer, ItemContainer]}>
22-
{(accordionStore, itemStore) => {
23-
const { uuid } = itemStore.state;
24-
const { items, accordion } = accordionStore.state;
25-
const item = items.filter(stateItem => stateItem.uuid === uuid)[0];
26-
return (
27-
<AccordionItemBody {...props} {...item} accordion={accordion} />
28-
);
29-
}}
30-
</Subscribe>
31-
);
32-
AccordionItemBodyWrapper.defaultProps = defaultProps;
15+
class AccordionItemBodyWrapper extends Component<
16+
AccordionItemBodyWrapperProps,
17+
> {
18+
static defaultProps = {
19+
className: 'accordion__body',
20+
hideBodyClassName: 'accordion__body--hidden',
21+
};
22+
23+
renderItemBody = (
24+
accordionStore: AccordionContainer,
25+
itemStore: ItemContainer,
26+
) => {
27+
const { uuid } = itemStore.state;
28+
const { items, accordion } = accordionStore.state;
29+
const item = items.filter(stateItem => stateItem.uuid === uuid)[0];
30+
return (
31+
<AccordionItemBody
32+
{...this.props}
33+
{...item}
34+
accordion={accordion}
35+
/>
36+
);
37+
};
38+
39+
render() {
40+
return (
41+
<Subscribe to={[AccordionContainer, ItemContainer]}>
42+
{this.renderItemBody}
43+
</Subscribe>
44+
);
45+
}
46+
}
3347

3448
export default AccordionItemBodyWrapper;
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,50 @@
11
// @flow
22

3-
import React from 'react';
3+
import React, { Component } from 'react';
44
import type { ElementProps } from 'react';
55

66
import { Subscribe } from 'unstated';
77
import AccordionContainer from '../AccordionContainer/AccordionContainer';
88
import ItemContainer from '../ItemContainer/ItemContainer';
99
import AccordionItemTitle from './AccordionItemTitle';
1010

11-
const defaultProps = {
12-
className: 'accordion__title',
13-
hideBodyClassName: '',
14-
};
15-
1611
type AccordionItemTitleWrapperProps = ElementProps<'div'> & {
1712
hideBodyClassName: string,
1813
};
1914

20-
const AccordionItemTitleWrapper = (props: AccordionItemTitleWrapperProps) => (
21-
<Subscribe to={[AccordionContainer, ItemContainer]}>
22-
{(accordionStore, itemStore) => {
23-
const { uuid } = itemStore.state;
24-
const { items, accordion } = accordionStore.state;
25-
const item = items.filter(stateItem => stateItem.uuid === uuid)[0];
26-
27-
return (
28-
<AccordionItemTitle
29-
{...props}
30-
{...item}
31-
setExpanded={accordionStore.setExpanded}
32-
accordion={accordion}
33-
/>
34-
);
35-
}}
36-
</Subscribe>
37-
);
38-
AccordionItemTitleWrapper.defaultProps = defaultProps;
15+
class AccordionItemTitleWrapper extends Component<
16+
AccordionItemTitleWrapperProps,
17+
> {
18+
static defaultProps = {
19+
className: 'accordion__title',
20+
hideBodyClassName: '',
21+
};
22+
23+
renderItemTitle = (
24+
accordionStore: AccordionContainer,
25+
itemStore: ItemContainer,
26+
) => {
27+
const { uuid } = itemStore.state;
28+
const { items, accordion } = accordionStore.state;
29+
const item = items.filter(stateItem => stateItem.uuid === uuid)[0];
30+
31+
return (
32+
<AccordionItemTitle
33+
{...this.props}
34+
{...item}
35+
setExpanded={accordionStore.setExpanded}
36+
accordion={accordion}
37+
/>
38+
);
39+
};
40+
41+
render() {
42+
return (
43+
<Subscribe to={[AccordionContainer, ItemContainer]}>
44+
{this.renderItemTitle}
45+
</Subscribe>
46+
);
47+
}
48+
}
3949

4050
export default AccordionItemTitleWrapper;

0 commit comments

Comments
 (0)