From 4ba75309d89a4f26ef2962eb02ff53cdaa353135 Mon Sep 17 00:00:00 2001 From: Anton Korzunov Date: Sat, 15 Jun 2019 22:51:16 +1000 Subject: [PATCH] fix: hot render of forward props component --- src/internal/stack/hydrateFiberStack.js | 2 +- src/reconciler/hotReplacementRender.js | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/internal/stack/hydrateFiberStack.js b/src/internal/stack/hydrateFiberStack.js index 7ac0f49af..839947043 100644 --- a/src/internal/stack/hydrateFiberStack.js +++ b/src/internal/stack/hydrateFiberStack.js @@ -1,7 +1,7 @@ /* eslint-disable no-underscore-dangle */ import ReactDOM from 'react-dom'; -const hotRenderWithHooks = ReactDOM.hotRenderWithHooks || ((fiber, render) => render()); +export const hotRenderWithHooks = ReactDOM.hotRenderWithHooks || ((fiber, render) => render()); function pushStack(stack, node) { stack.type = node.type; diff --git a/src/reconciler/hotReplacementRender.js b/src/reconciler/hotReplacementRender.js index 21bf6eb35..44b822235 100644 --- a/src/reconciler/hotReplacementRender.js +++ b/src/reconciler/hotReplacementRender.js @@ -18,6 +18,7 @@ import logger from '../logger'; import configuration, { internalConfiguration } from '../configuration'; import { areSwappable } from './utils'; import { resolveType } from './resolver'; +import { hotRenderWithHooks } from '../internal/stack/hydrateFiberStack'; let renderStack = []; @@ -51,7 +52,7 @@ const unflatten = a => const isArray = fn => Array.isArray(fn); const asArray = a => (isArray(a) ? a : [a]); -const render = component => { +const render = (component, stack) => { if (!component) { return []; } @@ -64,7 +65,8 @@ const render = component => { return component.hotComponentRender ? component.hotComponentRender() : component.render(); } if (isForwardType(component)) { - return component.type.render(component.props, null); + // render forward type in a sandbox + return hotRenderWithHooks(stack.fiber, () => component.type.render(component.props, null)); } if (isArray(component)) { return component.map(render); @@ -194,7 +196,7 @@ const hotReplacementRender = (instance, stack) => { } try { - const flow = transformFlowNode(filterNullArray(asArray(render(instance)))); + const flow = transformFlowNode(filterNullArray(asArray(render(instance, stack)))); const { children } = stack;