@samitouri / QOS-React-2 / commits / b8b10001f3

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