From 21a22e2da46afd84e5524d45bbc1a3e45bcb2fa3 Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Wed, 28 Mar 2018 13:12:34 -0700 Subject: [PATCH] Added DEV warning if getSnapshotBeforeUpdate is defined as a static method --- .../src/ReactFiberClassComponent.js | 8 ++++++++ .../ReactCoffeeScriptClass-test.coffee | 11 +++++++++++ .../react/src/__tests__/ReactES6Class-test.js | 13 +++++++++++++ .../__tests__/ReactTypeScriptClass-test.ts | 16 ++++++++++++++++ .../createReactClassIntegration-test.js | 19 +++++++++++++++++++ 5 files changed, 67 insertions(+) diff --git a/packages/react-reconciler/src/ReactFiberClassComponent.js b/packages/react-reconciler/src/ReactFiberClassComponent.js index bf0baf0d865f3..656ae9a055f0b 100644 --- a/packages/react-reconciler/src/ReactFiberClassComponent.js +++ b/packages/react-reconciler/src/ReactFiberClassComponent.js @@ -398,6 +398,14 @@ export default function( 'and will be ignored. Instead, declare it as a static method.', name, ); + const noStaticGetSnapshotBeforeUpdate = + typeof type.getSnapshotBeforeUpdate !== 'function'; + warning( + noStaticGetSnapshotBeforeUpdate, + '%s: getSnapshotBeforeUpdate() is defined as a static method ' + + 'and will be ignored. Instead, declare it as an instance method.', + name, + ); const state = instance.state; if (state && (typeof state !== 'object' || isArray(state))) { warning(false, '%s.state: must be set to an object or null', name); diff --git a/packages/react/src/__tests__/ReactCoffeeScriptClass-test.coffee b/packages/react/src/__tests__/ReactCoffeeScriptClass-test.coffee index 892a96d047585..a137a5488b4e7 100644 --- a/packages/react/src/__tests__/ReactCoffeeScriptClass-test.coffee +++ b/packages/react/src/__tests__/ReactCoffeeScriptClass-test.coffee @@ -140,6 +140,17 @@ describe 'ReactCoffeeScriptClass', -> ).toWarnDev 'Foo: getDerivedStateFromCatch() is defined as an instance method and will be ignored. Instead, declare it as a static method.', undefined + it 'warns if getSnapshotBeforeUpdate is static', -> + class Foo extends React.Component + render: -> + div() + Foo.getSnapshotBeforeUpdate = () -> + {} + expect(-> + ReactDOM.render(React.createElement(Foo, foo: 'foo'), container) + ).toWarnDev 'Foo: getSnapshotBeforeUpdate() is defined as a static method and will be ignored. Instead, declare it as an instance method.', + undefined + it 'warns if state not initialized before static getDerivedStateFromProps', -> class Foo extends React.Component render: -> diff --git a/packages/react/src/__tests__/ReactES6Class-test.js b/packages/react/src/__tests__/ReactES6Class-test.js index c48d7244a4c97..8284f53e4418e 100644 --- a/packages/react/src/__tests__/ReactES6Class-test.js +++ b/packages/react/src/__tests__/ReactES6Class-test.js @@ -158,6 +158,19 @@ describe('ReactES6Class', () => { ); }); + it('warns if getSnapshotBeforeUpdate is static', () => { + class Foo extends React.Component { + static getSnapshotBeforeUpdate() {} + render() { + return
; + } + } + expect(() => ReactDOM.render(, container)).toWarnDev( + 'Foo: getSnapshotBeforeUpdate() is defined as a static method ' + + 'and will be ignored. Instead, declare it as an instance method.', + ); + }); + it('warns if state not initialized before static getDerivedStateFromProps', () => { class Foo extends React.Component { static getDerivedStateFromProps(nextProps, prevState) { diff --git a/packages/react/src/__tests__/ReactTypeScriptClass-test.ts b/packages/react/src/__tests__/ReactTypeScriptClass-test.ts index b51b89cc2548d..930b13c414b6c 100644 --- a/packages/react/src/__tests__/ReactTypeScriptClass-test.ts +++ b/packages/react/src/__tests__/ReactTypeScriptClass-test.ts @@ -412,6 +412,22 @@ describe('ReactTypeScriptClass', function() { ); }); + it('warns if getSnapshotBeforeUpdate is static', function() { + class Foo extends React.Component { + static getSnapshotBeforeUpdate() { + } + render() { + return React.createElement('div', {}); + } + } + expect(function() { + ReactDOM.render(React.createElement(Foo, {foo: 'foo'}), container); + }).toWarnDev( + 'Foo: getSnapshotBeforeUpdate() is defined as a static method ' + + 'and will be ignored. Instead, declare it as an instance method.' + ); + }); + it('warns if state not initialized before static getDerivedStateFromProps', function() { class Foo extends React.Component { static getDerivedStateFromProps(nextProps, prevState) { diff --git a/packages/react/src/__tests__/createReactClassIntegration-test.js b/packages/react/src/__tests__/createReactClassIntegration-test.js index a1dadaef4b0a2..d0d2babaf34b6 100644 --- a/packages/react/src/__tests__/createReactClassIntegration-test.js +++ b/packages/react/src/__tests__/createReactClassIntegration-test.js @@ -467,6 +467,25 @@ describe('create-react-class-integration', () => { ); }); + it('warns if getSnapshotBeforeUpdate is static', () => { + const Foo = createReactClass({ + statics: { + getSnapshotBeforeUpdate: function() { + return null; + }, + }, + render() { + return
; + }, + }); + expect(() => + ReactDOM.render(, document.createElement('div')), + ).toWarnDev( + 'Component: getSnapshotBeforeUpdate() is defined as a static method ' + + 'and will be ignored. Instead, declare it as an instance method.', + ); + }); + it('should warn if state is not properly initialized before getDerivedStateFromProps', () => { const Component = createReactClass({ statics: {