diff --git a/packages/react/src/__tests__/ReactChildren-test.js b/packages/react/src/__tests__/ReactChildren-test.js index 5cce6b24873f0..7843d203b0a15 100644 --- a/packages/react/src/__tests__/ReactChildren-test.js +++ b/packages/react/src/__tests__/ReactChildren-test.js @@ -1039,6 +1039,31 @@ describe('ReactChildren', () => { }); }); + it('does not throw on children without `_store`', async () => { + function ComponentRenderingFlattenedChildren({children}) { + return
{React.Children.toArray(children)}
; + } + + const source =
; + const productionElement = {}; + Object.entries(source).forEach(([key, value]) => { + if (key !== '_owner' && key !== '_store') { + productionElement[key] = value; + } + }); + Object.freeze(productionElement); + + const container = document.createElement('div'); + const root = ReactDOMClient.createRoot(container); + await act(() => { + root.render( + + {productionElement} + , + ); + }); + }); + it('should escape keys', () => { const zero =
; const one =
; diff --git a/packages/react/src/jsx/ReactJSXElement.js b/packages/react/src/jsx/ReactJSXElement.js index e0a689ec2404f..5edcb333ea571 100644 --- a/packages/react/src/jsx/ReactJSXElement.js +++ b/packages/react/src/jsx/ReactJSXElement.js @@ -813,7 +813,9 @@ export function cloneAndReplaceKey(oldElement, newKey) { ); if (__DEV__) { // The cloned element should inherit the original element's key validation. - clonedElement._store.validated = oldElement._store.validated; + if (oldElement._store) { + clonedElement._store.validated = oldElement._store.validated; + } } return clonedElement; }