You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.0 KiB
69 lines
2.0 KiB
/** |
|
* Copyright 2013-2015, 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"); |
|
|
|
var ReactRef = {}; |
|
|
|
function attachRef(ref, component, owner) { |
|
if (typeof ref === 'function') { |
|
ref(component.getPublicInstance()); |
|
} else { |
|
// Legacy ref |
|
ReactOwner.addComponentAsRefTo(component, ref, owner); |
|
} |
|
} |
|
|
|
function detachRef(ref, component, owner) { |
|
if (typeof ref === 'function') { |
|
ref(null); |
|
} else { |
|
// Legacy ref |
|
ReactOwner.removeComponentAsRefFrom(component, ref, owner); |
|
} |
|
} |
|
|
|
ReactRef.attachRefs = function(instance, element) { |
|
var ref = element.ref; |
|
if (ref != null) { |
|
attachRef(ref, instance, element._owner); |
|
} |
|
}; |
|
|
|
ReactRef.shouldUpdateRefs = function(prevElement, nextElement) { |
|
// 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. |
|
|
|
return ( |
|
nextElement._owner !== prevElement._owner || |
|
nextElement.ref !== prevElement.ref |
|
); |
|
}; |
|
|
|
ReactRef.detachRefs = function(instance, element) { |
|
var ref = element.ref; |
|
if (ref != null) { |
|
detachRef(ref, instance, element._owner); |
|
} |
|
}; |
|
|
|
module.exports = ReactRef;
|
|
|