Skip to content

Commit 6a7a4fd

Browse files
committed
Merge pull request #3675 from spicyj/gh-3655
Add warning for getDefaultProps on ES6 classes
2 parents e21f7c7 + b8b1000 commit 6a7a4fd

File tree

4 files changed

+43
-6
lines changed

4 files changed

+43
-6
lines changed

src/core/ReactCompositeComponent.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,14 @@ var ReactCompositeComponentMixin = {
170170
'Did you mean to define a state property instead?',
171171
this.getName() || 'a component'
172172
);
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+
);
173181
warning(
174182
!inst.propTypes,
175183
'propTypes was defined as an instance property on %s. Use a static ' +

src/modern/class/__tests__/ReactCoffeeScriptClass-test.coffee

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ describe 'ReactCoffeeScriptClass', ->
266266
but does not invoke them.', ->
267267
spyOn console, 'error'
268268
getInitialStateWasCalled = false
269+
getDefaultPropsWasCalled = false
269270
class Foo extends React.Component
270271
constructor: ->
271272
@contextTypes = {}
@@ -275,20 +276,28 @@ describe 'ReactCoffeeScriptClass', ->
275276
getInitialStateWasCalled = true
276277
{}
277278

279+
getDefaultProps: ->
280+
getDefaultPropsWasCalled = true
281+
{}
282+
278283
render: ->
279284
span
280285
className: 'foo'
281286

282287
test React.createElement(Foo), 'SPAN', 'foo'
283288
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
285291
expect(console.error.calls[0].args[0]).toContain(
286292
'getInitialState was defined on Foo, a plain JavaScript class.'
287293
)
288294
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.'
290296
)
291297
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(
292301
'contextTypes was defined as an instance property on Foo.'
293302
)
294303

src/modern/class/__tests__/ReactES6Class-test.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,7 @@ describe('ReactES6Class', function() {
297297
it('warns when classic properties are defined on the instance, ' +
298298
'but does not invoke them.', function() {
299299
spyOn(console, 'error');
300+
var getDefaultPropsWasCalled = false;
300301
var getInitialStateWasCalled = false;
301302
class Foo extends React.Component {
302303
constructor() {
@@ -307,20 +308,28 @@ describe('ReactES6Class', function() {
307308
getInitialStateWasCalled = true;
308309
return {};
309310
}
311+
getDefaultProps() {
312+
getDefaultPropsWasCalled = true;
313+
return {};
314+
}
310315
render() {
311316
return <span className="foo" />;
312317
}
313318
}
314319
test(<Foo />, 'SPAN', 'foo');
315320
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);
317323
expect(console.error.calls[0].args[0]).toContain(
318324
'getInitialState was defined on Foo, a plain JavaScript class.'
319325
);
320326
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.'
322328
);
323329
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(
324333
'contextTypes was defined as an instance property on Foo.'
325334
);
326335
});

src/modern/class/__tests__/ReactTypeScriptClass-test.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,14 @@ class NormalLifeCycles {
235235
// warns when classic properties are defined on the instance,
236236
// but does not invoke them.
237237
var getInitialStateWasCalled = false;
238+
var getDefaultPropsWasCalled = false;
238239
class ClassicProperties extends React.Component {
239240
contextTypes = {};
240241
propTypes = {};
242+
getDefaultProps() {
243+
getDefaultPropsWasCalled = true;
244+
return {};
245+
}
241246
getInitialState() {
242247
getInitialStateWasCalled = true;
243248
return {};
@@ -410,17 +415,23 @@ describe('ReactTypeScriptClass', function() {
410415
var warn = jest.genMockFn();
411416
console.error = warn;
412417
getInitialStateWasCalled = false;
418+
getDefaultPropsWasCalled = false;
413419
test(React.createElement(ClassicProperties), 'SPAN', 'foo');
414420
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);
416423
expect(warn.mock.calls[0][0]).toContain(
417424
'getInitialState was defined on ClassicProperties, ' +
418425
'a plain JavaScript class.'
419426
);
420427
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.'
422430
);
423431
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(
424435
'contextTypes was defined as an instance property on ClassicProperties.'
425436
);
426437
});

0 commit comments

Comments
 (0)