From 4460d2509e6aef5b08eaf546658e4575701808d9 Mon Sep 17 00:00:00 2001 From: Arjun Sharma Date: Sun, 14 Feb 2016 13:41:44 -0700 Subject: [PATCH] Fix #5929. Set default prop when prop is undefined while cloning --- src/isomorphic/classic/element/ReactElement.js | 10 ++++++++++ .../__tests__/ReactElementClone-test.js | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/isomorphic/classic/element/ReactElement.js b/src/isomorphic/classic/element/ReactElement.js index 024e3b29e36ee..bfc7a08345e11 100644 --- a/src/isomorphic/classic/element/ReactElement.js +++ b/src/isomorphic/classic/element/ReactElement.js @@ -264,6 +264,16 @@ ReactElement.cloneElement = function(element, config, children) { props.children = childArray; } + // Resolve default props + if (element.type && element.type.defaultProps) { + var defaultProps = element.type.defaultProps; + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + } + return ReactElement( element.type, key, diff --git a/src/isomorphic/classic/element/__tests__/ReactElementClone-test.js b/src/isomorphic/classic/element/__tests__/ReactElementClone-test.js index f4c5b4b761bd1..47b2783e50408 100644 --- a/src/isomorphic/classic/element/__tests__/ReactElementClone-test.js +++ b/src/isomorphic/classic/element/__tests__/ReactElementClone-test.js @@ -263,4 +263,22 @@ describe('ReactElementClone', function() { ); }); + it('overwrites undefined props when a default is available', function() { + var Component = React.createClass({ + getDefaultProps: function() { + return {fruit: 'persimmon'}; + }, + render: function() { + return React.createElement('span'); + }, + }); + + let element = React.createElement(Component); + element = React.cloneElement(element, { + fruit: undefined, + }); + + expect(element.props.fruit).toBe('persimmon'); + }); + });