Skip to content

Commit 407cdb4

Browse files
le0nikgajus
authored andcommitted
feat: do not change keys on children (#242)
1 parent 144a494 commit 407cdb4

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/linkClass.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,20 @@ import isIterable from './isIterable';
77
import parseStyleName from './parseStyleName';
88
import generateAppendClassName from './generateAppendClassName';
99

10+
const mapChildrenWithoutKeyPrefix = (children: ReactElement, mapper: Function, context: Object) => {
11+
if (typeof children === 'undefined' || children === null) {
12+
return children;
13+
}
14+
15+
const result = [];
16+
17+
React.Children.forEach(children, (child, index) => {
18+
result.push(mapper.call(context, child, index));
19+
});
20+
21+
return result;
22+
};
23+
1024
const linkElement = (element: ReactElement, styles: Object, configuration: Object): ReactElement => {
1125
let appendClassName;
1226
let elementIsFrozen;
@@ -27,7 +41,7 @@ const linkElement = (element: ReactElement, styles: Object, configuration: Objec
2741
if (React.isValidElement(elementShallowCopy.props.children)) {
2842
elementShallowCopy.props.children = linkElement(React.Children.only(elementShallowCopy.props.children), styles, configuration);
2943
} else if (_.isArray(elementShallowCopy.props.children) || isIterable(elementShallowCopy.props.children)) {
30-
elementShallowCopy.props.children = React.Children.map(elementShallowCopy.props.children, (node) => {
44+
elementShallowCopy.props.children = mapChildrenWithoutKeyPrefix(elementShallowCopy.props.children, (node) => {
3145
if (React.isValidElement(node)) {
3246
return linkElement(node, styles, configuration);
3347
} else {

tests/linkClass.js

+14
Original file line numberDiff line numberDiff line change
@@ -290,4 +290,18 @@ describe('linkClass', () => {
290290
expect(subject.props.children[0].props.className).to.deep.equal('bar-1');
291291
expect(subject.props.children[0].props).not.to.have.property('styleName');
292292
});
293+
294+
it('does not change defined keys of children if there are multiple children', () => {
295+
let subject;
296+
297+
subject = <div>
298+
<span key='foo' />
299+
<span key='bar' />
300+
</div>;
301+
302+
subject = linkClass(subject);
303+
304+
expect(subject.props.children[0].key).to.equal('foo');
305+
expect(subject.props.children[1].key).to.equal('bar');
306+
});
293307
});

0 commit comments

Comments
 (0)