From 46556a4a57202aae03e092585977398c8b2a5a9d Mon Sep 17 00:00:00 2001 From: pmaccart Date: Tue, 7 Jul 2020 09:05:41 -0700 Subject: [PATCH] reset hooks state on error --- .../src/server/ReactPartialRenderer.js | 2 ++ .../src/server/ReactPartialRendererHooks.js | 31 ++++++++++++++----- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/packages/react-dom/src/server/ReactPartialRenderer.js b/packages/react-dom/src/server/ReactPartialRenderer.js index 63693ed1b5930..8e05eba864c81 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 e2ad5b1739b1b..bc17b73450c17 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,