diff --git a/packages/react-dom/src/server/ReactPartialRenderer.js b/packages/react-dom/src/server/ReactPartialRenderer.js index 63693ed1b593..8e05eba864c8 100644 --- a/packages/react-dom/src/server/ReactPartialRenderer.js +++ b/packages/react-dom/src/server/ReactPartialRenderer.js @@ -60,6 +60,7 @@ import escapeTextForBrowser from './escapeTextForBrowser'; import { prepareToUseHooks, finishHooks, + resetHooksState, Dispatcher, currentPartialRenderer, setCurrentPartialRenderer, @@ -955,6 +956,7 @@ class ReactDOMServerRenderer { } finally { ReactCurrentDispatcher.current = prevDispatcher; setCurrentPartialRenderer(prevPartialRenderer); + resetHooksState(); } } diff --git a/packages/react-dom/src/server/ReactPartialRendererHooks.js b/packages/react-dom/src/server/ReactPartialRendererHooks.js index e2ad5b1739b1..bc17b73450c1 100644 --- a/packages/react-dom/src/server/ReactPartialRendererHooks.js +++ b/packages/react-dom/src/server/ReactPartialRendererHooks.js @@ -172,12 +172,12 @@ export function prepareToUseHooks(componentIdentity: Object): void { isInHookUserCodeInDev = false; } - // Reset the internal hooks state before rendering a component - didScheduleRenderPhaseUpdate = false; - firstWorkInProgressHook = null; - numberOfReRenders = 0; - renderPhaseUpdates = null; - workInProgressHook = null; + // The following should have already been reset + // didScheduleRenderPhaseUpdate = false; + // firstWorkInProgressHook = null; + // numberOfReRenders = 0; + // renderPhaseUpdates = null; + // workInProgressHook = null; } export function finishHooks( @@ -202,14 +202,31 @@ export function finishHooks( children = Component(props, refOrContext); } - + resetHooksState(); if (__DEV__) { isInHookUserCodeInDev = false; } + // These were reset via the resetHooksState() call + // currentlyRenderingComponent = null; + // didScheduleRenderPhaseUpdate = false; + // firstWorkInProgressHook = null; + // numberOfReRenders = 0; + // renderPhaseUpdates = null; + // workInProgressHook = null; + return children; } +// Reset the internal hooks state if an error occurs while rendering a component +export function resetHooksState(): void { + didScheduleRenderPhaseUpdate = false; + firstWorkInProgressHook = null; + numberOfReRenders = 0; + renderPhaseUpdates = null; + workInProgressHook = null; +} + function readContext( context: ReactContext, observedBits: void | number | boolean,