diff --git a/scripts/fiber/tests-passing.txt b/scripts/fiber/tests-passing.txt index 387a1fa69c..586dd4f7e3 100644 --- a/scripts/fiber/tests-passing.txt +++ b/scripts/fiber/tests-passing.txt @@ -400,6 +400,7 @@ src/isomorphic/modern/class/__tests__/ReactCoffeeScriptClass-test.coffee * renders using forceUpdate even when there is no state * will call all the normal life cycle methods * warns when classic properties are defined on the instance, but does not invoke them. +* does not warn about getInitialState() on class components if state is also defined. * should warn when misspelling shouldComponentUpdate * should warn when misspelling componentWillReceiveProps * should throw AND warn when trying to access classic APIs @@ -422,6 +423,7 @@ src/isomorphic/modern/class/__tests__/ReactES6Class-test.js * renders using forceUpdate even when there is no state * will call all the normal life cycle methods * warns when classic properties are defined on the instance, but does not invoke them. +* does not warn about getInitialState() on class components if state is also defined. * should warn when misspelling shouldComponentUpdate * should warn when misspelling componentWillReceiveProps * should throw AND warn when trying to access classic APIs @@ -449,6 +451,7 @@ src/isomorphic/modern/class/__tests__/ReactTypeScriptClass-test.ts * renders using forceUpdate even when there is no state * will call all the normal life cycle methods * warns when classic properties are defined on the instance, but does not invoke them. +* does not warn about getInitialState() on class components if state is also defined. * should warn when misspelling shouldComponentUpdate * should warn when misspelling componentWillReceiveProps * should throw AND warn when trying to access classic APIs diff --git a/src/isomorphic/modern/class/__tests__/ReactCoffeeScriptClass-test.coffee b/src/isomorphic/modern/class/__tests__/ReactCoffeeScriptClass-test.coffee index cf71005350..de03d875b0 100644 --- a/src/isomorphic/modern/class/__tests__/ReactCoffeeScriptClass-test.coffee +++ b/src/isomorphic/modern/class/__tests__/ReactCoffeeScriptClass-test.coffee @@ -319,6 +319,25 @@ describe 'ReactCoffeeScriptClass', -> ) undefined + it 'does not warn about getInitialState() on class components + if state is also defined.', -> + spyOn console, 'error' + class Foo extends React.Component + constructor: (props) -> + super props + @state = bar: @props.initialValue + + getInitialState: -> + {} + + render: -> + span + className: 'foo' + + test React.createElement(Foo), 'SPAN', 'foo' + expect(console.error.calls.count()).toBe 0 + undefined + it 'should warn when misspelling shouldComponentUpdate', -> spyOn console, 'error' class NamedComponent extends React.Component diff --git a/src/isomorphic/modern/class/__tests__/ReactES6Class-test.js b/src/isomorphic/modern/class/__tests__/ReactES6Class-test.js index 2ff9091c1a..ca34089157 100644 --- a/src/isomorphic/modern/class/__tests__/ReactES6Class-test.js +++ b/src/isomorphic/modern/class/__tests__/ReactES6Class-test.js @@ -354,6 +354,21 @@ describe('ReactES6Class', () => { ); }); + it('does not warn about getInitialState() on class components if state is also defined.', () => { + spyOn(console, 'error'); + class Foo extends React.Component { + state = this.getInitialState(); + getInitialState() { + return {}; + } + render() { + return ; + } + } + test(, 'SPAN', 'foo'); + expect(console.error.calls.count()).toBe(0); + }); + it('should warn when misspelling shouldComponentUpdate', () => { spyOn(console, 'error'); diff --git a/src/isomorphic/modern/class/__tests__/ReactTypeScriptClass-test.ts b/src/isomorphic/modern/class/__tests__/ReactTypeScriptClass-test.ts index 0e90be788a..6ef95ccaa3 100644 --- a/src/isomorphic/modern/class/__tests__/ReactTypeScriptClass-test.ts +++ b/src/isomorphic/modern/class/__tests__/ReactTypeScriptClass-test.ts @@ -454,6 +454,24 @@ describe('ReactTypeScriptClass', function() { ); }); + it('does not warn about getInitialState() on class components ' + + 'if state is also defined.', () => { + spyOn(console, 'error'); + + class Example extends React.Component { + state = {}; + getInitialState() { + return {}; + } + render() { + return React.createElement('span', {className: 'foo'}); + } + } + + test(React.createElement(Example), 'SPAN', 'foo'); + expect((console.error).calls.count()).toBe(0); + }); + it('should warn when misspelling shouldComponentUpdate', function() { spyOn(console, 'error'); diff --git a/src/renderers/shared/fiber/ReactFiberClassComponent.js b/src/renderers/shared/fiber/ReactFiberClassComponent.js index 3772571f8d..b8813947b0 100644 --- a/src/renderers/shared/fiber/ReactFiberClassComponent.js +++ b/src/renderers/shared/fiber/ReactFiberClassComponent.js @@ -104,7 +104,8 @@ module.exports = function( ); const noGetInitialStateOnES6 = ( !instance.getInitialState || - instance.getInitialState.isReactClassApproved + instance.getInitialState.isReactClassApproved || + instance.state ); warning( noGetInitialStateOnES6, diff --git a/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js b/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js index a4c3ee9c09..8fdaec8c1b 100644 --- a/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js +++ b/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js @@ -271,7 +271,8 @@ var ReactCompositeComponent = { // catch them here, at initialization time, instead. warning( !inst.getInitialState || - inst.getInitialState.isReactClassApproved, + inst.getInitialState.isReactClassApproved || + inst.state, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?',