From 31dd6944d34f404ec1caabc54c53f7f79d616214 Mon Sep 17 00:00:00 2001 From: Christopher Chedeau Date: Fri, 2 Sep 2016 14:16:32 -0700 Subject: [PATCH] Type ReactRef (#7600) Nothing out of the ordinary on this one. --- .../shared/stack/reconciler/ReactRef.js | 45 ++++++++++++++----- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/renderers/shared/stack/reconciler/ReactRef.js b/src/renderers/shared/stack/reconciler/ReactRef.js index a33ca13f1c..43210a5a26 100644 --- a/src/renderers/shared/stack/reconciler/ReactRef.js +++ b/src/renderers/shared/stack/reconciler/ReactRef.js @@ -7,12 +7,16 @@ * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactRef + * @flow */ 'use strict'; var ReactOwner = require('ReactOwner'); +import type { ReactInstance } from 'ReactInstanceType'; +import type { ReactElement } from 'ReactElementType'; + var ReactRef = {}; function attachRef(ref, component, owner) { @@ -33,8 +37,11 @@ function detachRef(ref, component, owner) { } } -ReactRef.attachRefs = function(instance, element) { - if (element === null || element === false) { +ReactRef.attachRefs = function( + instance: ReactInstance, + element: ReactElement | string | number | null | false, +): void { + if (element === null || typeof element !== 'object') { return; } var ref = element.ref; @@ -43,7 +50,10 @@ ReactRef.attachRefs = function(instance, element) { } }; -ReactRef.shouldUpdateRefs = function(prevElement, nextElement) { +ReactRef.shouldUpdateRefs = function( + prevElement: ReactElement | string | number | null | false, + nextElement: ReactElement | string | number | null | false, +): bool { // If either the owner or a `ref` has changed, make sure the newest owner // has stored a reference to `this`, and the previous owner (if different) // has forgotten the reference to `this`. We use the element instead @@ -56,21 +66,32 @@ ReactRef.shouldUpdateRefs = function(prevElement, nextElement) { // is made. It probably belongs where the key checking and // instantiateReactComponent is done. - var prevEmpty = prevElement === null || prevElement === false; - var nextEmpty = nextElement === null || nextElement === false; + var prevRef = null; + var prevOwner = null; + if (prevElement !== null && typeof prevElement === 'object') { + prevRef = prevElement.ref; + prevOwner = prevElement._owner; + } + + var nextRef = null; + var nextOwner = null; + if (nextElement !== null && typeof nextElement === 'object') { + nextRef = nextElement.ref; + nextOwner = nextElement._owner; + } return ( - // This has a few false positives w/r/t empty components. - prevEmpty || nextEmpty || - nextElement.ref !== prevElement.ref || + prevRef !== nextRef || // If owner changes but we have an unchanged function ref, don't update refs - (typeof nextElement.ref === 'string' && - nextElement._owner !== prevElement._owner) + (typeof nextRef === 'string' && nextOwner !== prevOwner) ); }; -ReactRef.detachRefs = function(instance, element) { - if (element === null || element === false) { +ReactRef.detachRefs = function( + instance: ReactInstance, + element: ReactElement | string | number | null | false, +): void { + if (element === null || typeof element !== 'object') { return; } var ref = element.ref;