Add warning for getDefaultProps on ES6 classes
Fixes #3655.
Ben Alpert committed
Apr 15, 2015 at 17:32 UTC
b8b10001f3501b807c74781428824d5f6d9917a0
4 files changed
+43
-6
src/core/ReactCompositeComponent.js
+8
@@ -170,6 +170,14 @@ var ReactCompositeComponentMixin = {
170
'Did you mean to define a state property instead?',
171
this.getName() || 'a component'
172
);
173
+ warning(
174
+ !inst.getDefaultProps ||
175
+ inst.getDefaultProps.isReactClassApproved,
176
+ 'getDefaultProps was defined on %s, a plain JavaScript class. ' +
177
+ 'This is only supported for classes created using React.createClass. ' +
178
+ 'Use a static property to define defaultProps instead.',
179
+ this.getName() || 'a component'
180
+ );
181
warning(
182
!inst.propTypes,
183
'propTypes was defined as an instance property on %s. Use a static ' +
src/modern/class/__tests__/ReactCoffeeScriptClass-test.coffee
+11
-2
@@ -266,6 +266,7 @@ describe 'ReactCoffeeScriptClass', ->
266
but does not invoke them.', ->
267
spyOn console, 'error'
268
getInitialStateWasCalled = false
269
+ getDefaultPropsWasCalled = false
270
class Foo extends React.Component
271
constructor: ->
272
@contextTypes = {}
@@ -275,20 +276,28 @@ describe 'ReactCoffeeScriptClass', ->
276
getInitialStateWasCalled = true
277
{}
278
279
+ getDefaultProps: ->
280
+ getDefaultPropsWasCalled = true
281
+ {}
282
+
283
render: ->
284
span
285
className: 'foo'
286
287
test React.createElement(Foo), 'SPAN', 'foo'
288
expect(getInitialStateWasCalled).toBe false
284
- expect(console.error.calls.length).toBe 3
289
+ expect(getDefaultPropsWasCalled).toBe false
290
+ expect(console.error.calls.length).toBe 4
291
expect(console.error.calls[0].args[0]).toContain(
292
'getInitialState was defined on Foo, a plain JavaScript class.'
293
)
294
expect(console.error.calls[1].args[0]).toContain(
289
- 'propTypes was defined as an instance property on Foo.'
295
+ 'getDefaultProps was defined on Foo, a plain JavaScript class.'
296
)
297
expect(console.error.calls[2].args[0]).toContain(
298
+ 'propTypes was defined as an instance property on Foo.'
299
+ )
300
+ expect(console.error.calls[3].args[0]).toContain(
301
'contextTypes was defined as an instance property on Foo.'
302
)
303
src/modern/class/__tests__/ReactES6Class-test.js
+11
-2
@@ -297,6 +297,7 @@ describe('ReactES6Class', function() {
297
it('warns when classic properties are defined on the instance, ' +
298
'but does not invoke them.', function() {
299
spyOn(console, 'error');
300
+ var getDefaultPropsWasCalled = false;
301
var getInitialStateWasCalled = false;
302
class Foo extends React.Component {
303
constructor() {
@@ -307,20 +308,28 @@ describe('ReactES6Class', function() {
308
getInitialStateWasCalled = true;
309
return {};
310
}
311
+ getDefaultProps() {
312
+ getDefaultPropsWasCalled = true;
313
+ return {};
314
+ }
315
render() {
316
return <span className="foo" />;
317
}
318
}
319
test(<Foo />, 'SPAN', 'foo');
320
expect(getInitialStateWasCalled).toBe(false);
316
- expect(console.error.calls.length).toBe(3);
321
+ expect(getDefaultPropsWasCalled).toBe(false);
322
+ expect(console.error.calls.length).toBe(4);
323
expect(console.error.calls[0].args[0]).toContain(
324
'getInitialState was defined on Foo, a plain JavaScript class.'
325
);
326
expect(console.error.calls[1].args[0]).toContain(
321
- 'propTypes was defined as an instance property on Foo.'
327
+ 'getDefaultProps was defined on Foo, a plain JavaScript class.'
328
);
329
expect(console.error.calls[2].args[0]).toContain(
330
+ 'propTypes was defined as an instance property on Foo.'
331
+ );
332
+ expect(console.error.calls[3].args[0]).toContain(
333
'contextTypes was defined as an instance property on Foo.'
334
);
335
});
src/modern/class/__tests__/ReactTypeScriptClass-test.ts
+13
-2
@@ -235,9 +235,14 @@ class NormalLifeCycles {
235
// warns when classic properties are defined on the instance,
236
// but does not invoke them.
237
var getInitialStateWasCalled = false;
238
+var getDefaultPropsWasCalled = false;
239
class ClassicProperties extends React.Component {
240
contextTypes = {};
241
propTypes = {};
242
+ getDefaultProps() {
243
+ getDefaultPropsWasCalled = true;
244
+ return {};
245
+ }
246
getInitialState() {
247
getInitialStateWasCalled = true;
248
return {};
@@ -410,17 +415,23 @@ describe('ReactTypeScriptClass', function() {
415
var warn = jest.genMockFn();
416
console.error = warn;
417
getInitialStateWasCalled = false;
418
+ getDefaultPropsWasCalled = false;
419
test(React.createElement(ClassicProperties), 'SPAN', 'foo');
420
expect(getInitialStateWasCalled).toBe(false);
415
- expect(warn.mock.calls.length).toBe(3);
421
+ expect(getDefaultPropsWasCalled).toBe(false);
422
+ expect(warn.mock.calls.length).toBe(4);
423
expect(warn.mock.calls[0][0]).toContain(
424
'getInitialState was defined on ClassicProperties, ' +
425
'a plain JavaScript class.'
426
);
427
expect(warn.mock.calls[1][0]).toContain(
421
- 'propTypes was defined as an instance property on ClassicProperties.'
428
+ 'getDefaultProps was defined on ClassicProperties, ' +
429
+ 'a plain JavaScript class.'
430
);
431
expect(warn.mock.calls[2][0]).toContain(
432
+ 'propTypes was defined as an instance property on ClassicProperties.'
433
+ );
434
+ expect(warn.mock.calls[3][0]).toContain(
435
'contextTypes was defined as an instance property on ClassicProperties.'
436
);
437
});