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
});