UNPKG

react-native

Version:

A framework for building native apps using React

110 lines (95 loc) 3.12 kB
/** * Copyright 2013-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @providesModule ReactRef */ 'use strict'; var ReactOwner = require('ReactOwner'); import type { ReactInstance } from 'ReactInstanceType'; import type { ReactElement } from 'ReactElementType'; import type { Transaction } from 'Transaction'; var ReactRef = {}; function attachRef(ref, component, owner, transaction) { if (typeof ref === 'function') { ref(component.getPublicInstance(transaction)); } else { // Legacy ref ReactOwner.addComponentAsRefTo( component, ref, owner, transaction, ); } } function detachRef(ref, component, owner) { if (typeof ref === 'function') { ref(null); } else { // Legacy ref ReactOwner.removeComponentAsRefFrom(component, ref, owner); } } ReactRef.attachRefs = function( instance: ReactInstance, element: ReactElement | string | number | null | false, transaction: Transaction, ): void { if (element === null || typeof element !== 'object') { return; } var ref = element.ref; if (ref != null) { attachRef(ref, instance, element._owner, transaction); } }; ReactRef.shouldUpdateRefs = function( prevElement: ReactElement | string | number | null | false, nextElement: ReactElement | string | number | null | false, ): boolean { // 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 // of the public this.props because the post processing cannot determine // a ref. The ref conceptually lives on the element. // TODO: Should this even be possible? The owner cannot change because // it's forbidden by shouldUpdateReactComponent. The ref can change // if you swap the keys of but not the refs. Reconsider where this check // is made. It probably belongs where the key checking and // instantiateReactComponent is done. 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 ( prevRef !== nextRef || // If owner changes but we have an unchanged function ref, don't update refs (typeof nextRef === 'string' && nextOwner !== prevOwner) ); }; ReactRef.detachRefs = function( instance: ReactInstance, element: ReactElement | string | number | null | false, ): void { if (element === null || typeof element !== 'object') { return; } var ref = element.ref; if (ref != null) { detachRef(ref, instance, element._owner); } }; module.exports = ReactRef;