Skip to content

Commit abf20a2

Browse files
fix(dom-to-react): allow custom keys for replacement
1 parent 570bf1a commit abf20a2

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

lib/dom-to-react.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ function domToReact(nodes, options) {
3030
// specify a "key" prop if element has siblings
3131
// https://fb.me/react-warning-keys
3232
if (len > 1) {
33-
replacement = React.cloneElement(replacement, { key: i });
33+
replacement = React.cloneElement(replacement, {
34+
key: replacement.key || i
35+
});
3436
}
3537
result.push(replacement);
3638
continue;

test/dom-to-react.js

+36
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,42 @@ describe('dom-to-react parser', () => {
159159
);
160160
});
161161

162+
it('does not modify keys for replacement if it have one', () => {
163+
const html = [data.html.single, data.html.customElement].join('');
164+
165+
const reactElements = domToReact(htmlToDOM(html), {
166+
replace: node => {
167+
if (node.name === 'p') {
168+
return React.createElement('p', {}, 'replaced foo');
169+
}
170+
if (node.name === 'custom-button') {
171+
return React.createElement(
172+
'custom-button',
173+
{
174+
key: 'meyKey',
175+
class: 'myClass',
176+
'custom-attribute': 'replaced value'
177+
},
178+
null
179+
);
180+
}
181+
}
182+
});
183+
184+
assert.deepEqual(reactElements, [
185+
React.createElement('p', { key: 0 }, 'replaced foo'),
186+
React.createElement(
187+
'custom-button',
188+
{
189+
key: 'meyKey',
190+
class: 'myClass',
191+
'custom-attribute': 'replaced value'
192+
},
193+
null
194+
)
195+
]);
196+
});
197+
162198
describe('when React <16', () => {
163199
const { PRESERVE_CUSTOM_ATTRIBUTES } = utilities;
164200

0 commit comments

Comments
 (0)