diff --git a/src/renderers/art/ReactARTFiber.js b/src/renderers/art/ReactARTFiber.js index 2c2705929d..d8cc169f01 100644 --- a/src/renderers/art/ReactARTFiber.js +++ b/src/renderers/art/ReactARTFiber.js @@ -503,6 +503,10 @@ const ARTRenderer = ReactFiberReconciler({ // Noop }, + areChildrenOffscreen(props : Props) { + return false; + }, + getRootHostContext() { return emptyObject; }, diff --git a/src/renderers/dom/fiber/ReactDOMFiber.js b/src/renderers/dom/fiber/ReactDOMFiber.js index 3954a062e2..8db736e340 100644 --- a/src/renderers/dom/fiber/ReactDOMFiber.js +++ b/src/renderers/dom/fiber/ReactDOMFiber.js @@ -69,6 +69,7 @@ type Container = Element; type Props = { autoFocus ?: boolean, children ?: mixed, + hidden ?: boolean, }; type Instance = Element; type TextInstance = Text; @@ -286,6 +287,10 @@ var DOMRenderer = ReactFiberReconciler({ domElement.textContent = ''; }, + areChildrenOffscreen(props : Props) : boolean { + return Boolean(props.hidden); + }, + createTextInstance( text : string, rootContainerInstance : Container, diff --git a/src/renderers/native/ReactNativeFiber.js b/src/renderers/native/ReactNativeFiber.js index 1d73e80b88..d761774bfe 100644 --- a/src/renderers/native/ReactNativeFiber.js +++ b/src/renderers/native/ReactNativeFiber.js @@ -343,6 +343,10 @@ const NativeRenderer = ReactFiberReconciler({ // Noop }, + areChildrenOffscreen(props : Props) : boolean { + return false; + }, + scheduleAnimationCallback: global.requestAnimationFrame, scheduleDeferredCallback: global.requestIdleCallback, diff --git a/src/renderers/noop/ReactNoop.js b/src/renderers/noop/ReactNoop.js index efb616651e..5b37a60306 100644 --- a/src/renderers/noop/ReactNoop.js +++ b/src/renderers/noop/ReactNoop.js @@ -35,7 +35,7 @@ var scheduledAnimationCallback = null; var scheduledDeferredCallback = null; type Container = { rootID: string, children: Array }; -type Props = { prop: any }; +type Props = { prop: any, hidden ?: boolean }; type Instance = {| type: string, id: number, children: Array, prop: any |}; type TextInstance = {| text: string, id: number |}; @@ -101,6 +101,10 @@ var NoopRenderer = ReactFiberReconciler({ resetTextContent(instance : Instance) : void {}, + areChildrenOffscreen(props : Props) : boolean { + return Boolean(props.hidden); + }, + createTextInstance( text : string, rootContainerInstance : Container, diff --git a/src/renderers/shared/fiber/ReactFiberBeginWork.js b/src/renderers/shared/fiber/ReactFiberBeginWork.js index dcbc697afe..378d5746f5 100644 --- a/src/renderers/shared/fiber/ReactFiberBeginWork.js +++ b/src/renderers/shared/fiber/ReactFiberBeginWork.js @@ -77,7 +77,7 @@ module.exports = function( getPriorityContext : () => PriorityLevel, ) { - const { shouldSetTextContent, useSyncScheduling } = config; + const { shouldSetTextContent, useSyncScheduling, areChildrenOffscreen } = config; const { pushHostContext, @@ -358,7 +358,7 @@ module.exports = function( } } else if (nextProps === null || memoizedProps === nextProps) { if (!useSyncScheduling && - memoizedProps.hidden && + areChildrenOffscreen(memoizedProps) && workInProgress.pendingWorkPriority !== OffscreenPriority) { // This subtree still has work, but it should be deprioritized so we need // to bail out and not do any work yet. @@ -400,7 +400,7 @@ module.exports = function( markRef(current, workInProgress); if (!useSyncScheduling && - nextProps.hidden && + areChildrenOffscreen(nextProps) && workInProgress.pendingWorkPriority !== OffscreenPriority) { // If this host component is hidden, we can bail out on the children. // We'll rerender the children later at the lower priority. diff --git a/src/renderers/shared/fiber/ReactFiberReconciler.js b/src/renderers/shared/fiber/ReactFiberReconciler.js index f1c2489162..ef53129ad6 100644 --- a/src/renderers/shared/fiber/ReactFiberReconciler.js +++ b/src/renderers/shared/fiber/ReactFiberReconciler.js @@ -83,6 +83,7 @@ export type HostConfig = { shouldSetTextContent(props : P) : boolean, resetTextContent(instance : I) : void, + areChildrenOffscreen(props : P) : boolean, createTextInstance( text : string, diff --git a/src/renderers/testing/ReactTestRendererFiber.js b/src/renderers/testing/ReactTestRendererFiber.js index a9fb64ccd6..c3f3bb5485 100644 --- a/src/renderers/testing/ReactTestRendererFiber.js +++ b/src/renderers/testing/ReactTestRendererFiber.js @@ -150,6 +150,10 @@ var TestRenderer = ReactFiberReconciler({ // noop }, + areChildrenOffscreen(props : Props) : boolean { + return false; + }, + createTextInstance( text : string, rootContainerInstance : Container,