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 9736c6febc01..e4ce77f17e8e 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 82a6175fd0c6..483f55902751 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; }, };