diff --git a/src/renderers/shared/reconciler/ReactCompositeComponent.js b/src/renderers/shared/reconciler/ReactCompositeComponent.js index 13657ad204a61..a8ccef5f501fd 100644 --- a/src/renderers/shared/reconciler/ReactCompositeComponent.js +++ b/src/renderers/shared/reconciler/ReactCompositeComponent.js @@ -194,6 +194,18 @@ var ReactCompositeComponentMixin = { Component.displayName || Component.name || 'Component' ); } + + var propsMutated = inst.props !== publicProps; + var componentName = + Component.displayName || Component.name || 'Component'; + + warning( + typeof inst.props === 'undefined' || + !propsMutated, + '%s(...): When calling super() in `%s`, make sure to pass ' + + 'up the same props that your component\'s constructor was passed.', + componentName, componentName + ); } // These should be set up in the constructor, but as a convenience for diff --git a/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js b/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js index 8935ab8231bbd..6d8bc37544979 100644 --- a/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js +++ b/src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js @@ -1171,4 +1171,31 @@ describe('ReactCompositeComponent', function() { }); + it('should warn when mutated props are passed', function() { + + var container = document.createElement('div'); + + class Foo extends React.Component { + constructor(props) { + var _props = { idx: props.idx + '!' }; + super(_props); + } + + render() { + return ; + } + } + + expect(console.error.calls.length).toBe(0); + + ReactDOM.render(, container); + + expect(console.error.calls.length).toBe(1); + expect(console.error.argsForCall[0][0]).toContain( + 'Foo(...): When calling super() in `Foo`, make sure to pass ' + + 'up the same props that your component\'s constructor was passed.' + ); + + }); + });