From 6e7c89ed8ac705522a051c5ebe55c0f6f4dc33d5 Mon Sep 17 00:00:00 2001 From: Sebastian Markbage Date: Thu, 20 Oct 2016 21:01:16 -0700 Subject: [PATCH] Quick fix to the return top level problem This doesn't deal with the fact that work is usually deferred so this will return null for first render (except in sync tests). It also doesn't deal with top levels being fragments etc. It doesn't deal with the host instance type being a wrapper around the public instance. This needs to be unified with refs and findDOMNode better. However, this does expose that we reactComponentExpect and ReactTestUtils doesn't work very well with Fiber. --- src/renderers/dom/fiber/ReactDOMFiber.js | 6 ++++-- .../shared/fiber/ReactFiberReconciler.js | 15 ++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/renderers/dom/fiber/ReactDOMFiber.js b/src/renderers/dom/fiber/ReactDOMFiber.js index 9736c6febc..e4ce77f17e 100644 --- a/src/renderers/dom/fiber/ReactDOMFiber.js +++ b/src/renderers/dom/fiber/ReactDOMFiber.js @@ -120,11 +120,13 @@ var ReactDOM = { render(element : ReactElement, container : DOMContainerElement) { warnAboutUnstableUse(); + let root; if (!container._reactRootContainer) { - container._reactRootContainer = DOMRenderer.mountContainer(element, container); + root = container._reactRootContainer = DOMRenderer.mountContainer(element, container); } else { - DOMRenderer.updateContainer(element, container._reactRootContainer); + DOMRenderer.updateContainer(element, root = container._reactRootContainer); } + return DOMRenderer.getPublicRootInstance(root); }, unmountComponentAtNode(container : DOMContainerElement) { diff --git a/src/renderers/shared/fiber/ReactFiberReconciler.js b/src/renderers/shared/fiber/ReactFiberReconciler.js index 82a6175fd0..483f559027 100644 --- a/src/renderers/shared/fiber/ReactFiberReconciler.js +++ b/src/renderers/shared/fiber/ReactFiberReconciler.js @@ -54,17 +54,17 @@ export type HostConfig = { type OpaqueNode = Fiber; -export type Reconciler = { +export type Reconciler = { mountContainer(element : ReactElement, containerInfo : C) : OpaqueNode, updateContainer(element : ReactElement, container : OpaqueNode) : void, unmountContainer(container : OpaqueNode) : void, performWithPriority(priorityLevel : PriorityLevel, fn : Function) : void, // Used to extract the return value from the initial render. Legacy API. - getPublicRootInstance(container : OpaqueNode) : (C | null), + getPublicRootInstance(container : OpaqueNode) : (ReactComponent | I | null), }; -module.exports = function(config : HostConfig) : Reconciler { +module.exports = function(config : HostConfig) : Reconciler { var { scheduleWork, performWithPriority } = ReactFiberScheduler(config); @@ -106,8 +106,13 @@ module.exports = function(config : HostConfig) : performWithPriority, - getPublicRootInstance(container : OpaqueNode) : (C | null) { - return null; + getPublicRootInstance(container : OpaqueNode) : (ReactComponent | I | null) { + const root : FiberRoot = (container.stateNode : any); + const containerFiber = root.current; + if (!containerFiber.child) { + return null; + } + return containerFiber.child.stateNode; }, };