@samitouri / QOS-React / commits / 593a234c1e

Warns when mutated props are passed.

Manas committed Oct 31, 2015 at 15:29 UTC 593a234c1ebef9a20bcb239badb9bb20018d4710
2 files changed +39
src/renderers/shared/reconciler/ReactCompositeComponent.js
+12
@@ -195,6 +195,18 @@ var ReactCompositeComponentMixin = {
195 Component.displayName || Component.name || 'Component'
196 );
197 }
198 +
199 + var propsMutated = inst.props !== publicProps;
200 + var componentName =
201 + Component.displayName || Component.name || 'Component';
202 +
203 + warning(
204 + typeof inst.props === 'undefined' ||
205 + !propsMutated,
206 + '%s(...): When calling super() in `%s`, make sure to pass ' +
207 + 'up the same props that your component\'s constructor was passed.',
208 + componentName, componentName
209 + );
210 }
211
212 // These should be set up in the constructor, but as a convenience for
src/renderers/shared/reconciler/__tests__/ReactCompositeComponent-test.js
+27
@@ -1241,4 +1241,31 @@ describe('ReactCompositeComponent', function() {
1241
1242 });
1243
1244 + it('should warn when mutated props are passed', function() {
1245 +
1246 + var container = document.createElement('div');
1247 +
1248 + class Foo extends React.Component {
1249 + constructor(props) {
1250 + var _props = { idx: props.idx + '!' };
1251 + super(_props);
1252 + }
1253 +
1254 + render() {
1255 + return <span />;
1256 + }
1257 + }
1258 +
1259 + expect(console.error.calls.length).toBe(0);
1260 +
1261 + ReactDOM.render(<Foo idx="qwe" />, container);
1262 +
1263 + expect(console.error.calls.length).toBe(1);
1264 + expect(console.error.argsForCall[0][0]).toContain(
1265 + 'Foo(...): When calling super() in `Foo`, make sure to pass ' +
1266 + 'up the same props that your component\'s constructor was passed.'
1267 + );
1268 +
1269 + });
1270 +
1271 });