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.
109 lines
3.6 KiB
109 lines
3.6 KiB
10 years ago
|
/**
|
||
|
* 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 ReactOwner
|
||
|
*/
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
var invariant = require("./invariant");
|
||
|
|
||
|
/**
|
||
|
* ReactOwners are capable of storing references to owned components.
|
||
|
*
|
||
|
* All components are capable of //being// referenced by owner components, but
|
||
|
* only ReactOwner components are capable of //referencing// owned components.
|
||
|
* The named reference is known as a "ref".
|
||
|
*
|
||
|
* Refs are available when mounted and updated during reconciliation.
|
||
|
*
|
||
|
* var MyComponent = React.createClass({
|
||
|
* render: function() {
|
||
|
* return (
|
||
|
* <div onClick={this.handleClick}>
|
||
|
* <CustomComponent ref="custom" />
|
||
|
* </div>
|
||
|
* );
|
||
|
* },
|
||
|
* handleClick: function() {
|
||
|
* this.refs.custom.handleClick();
|
||
|
* },
|
||
|
* componentDidMount: function() {
|
||
|
* this.refs.custom.initialize();
|
||
|
* }
|
||
|
* });
|
||
|
*
|
||
|
* Refs should rarely be used. When refs are used, they should only be done to
|
||
|
* control data that is not handled by React's data flow.
|
||
|
*
|
||
|
* @class ReactOwner
|
||
|
*/
|
||
|
var ReactOwner = {
|
||
|
|
||
|
/**
|
||
|
* @param {?object} object
|
||
|
* @return {boolean} True if `object` is a valid owner.
|
||
|
* @final
|
||
|
*/
|
||
|
isValidOwner: function(object) {
|
||
|
return !!(
|
||
|
(object &&
|
||
|
typeof object.attachRef === 'function' && typeof object.detachRef === 'function')
|
||
|
);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Adds a component by ref to an owner component.
|
||
|
*
|
||
|
* @param {ReactComponent} component Component to reference.
|
||
|
* @param {string} ref Name by which to refer to the component.
|
||
|
* @param {ReactOwner} owner Component on which to record the ref.
|
||
|
* @final
|
||
|
* @internal
|
||
|
*/
|
||
|
addComponentAsRefTo: function(component, ref, owner) {
|
||
|
("production" !== process.env.NODE_ENV ? invariant(
|
||
|
ReactOwner.isValidOwner(owner),
|
||
|
'addComponentAsRefTo(...): Only a ReactOwner can have refs. This ' +
|
||
|
'usually means that you\'re trying to add a ref to a component that ' +
|
||
|
'doesn\'t have an owner (that is, was not created inside of another ' +
|
||
|
'component\'s `render` method). Try rendering this component inside of ' +
|
||
|
'a new top-level component which will hold the ref.'
|
||
|
) : invariant(ReactOwner.isValidOwner(owner)));
|
||
|
owner.attachRef(ref, component);
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Removes a component by ref from an owner component.
|
||
|
*
|
||
|
* @param {ReactComponent} component Component to dereference.
|
||
|
* @param {string} ref Name of the ref to remove.
|
||
|
* @param {ReactOwner} owner Component on which the ref is recorded.
|
||
|
* @final
|
||
|
* @internal
|
||
|
*/
|
||
|
removeComponentAsRefFrom: function(component, ref, owner) {
|
||
|
("production" !== process.env.NODE_ENV ? invariant(
|
||
|
ReactOwner.isValidOwner(owner),
|
||
|
'removeComponentAsRefFrom(...): Only a ReactOwner can have refs. This ' +
|
||
|
'usually means that you\'re trying to remove a ref to a component that ' +
|
||
|
'doesn\'t have an owner (that is, was not created inside of another ' +
|
||
|
'component\'s `render` method). Try rendering this component inside of ' +
|
||
|
'a new top-level component which will hold the ref.'
|
||
|
) : invariant(ReactOwner.isValidOwner(owner)));
|
||
|
// Check that `component` is still the current ref because we do not want to
|
||
|
// detach the ref if another component stole it.
|
||
|
if (owner.getPublicInstance().refs[ref] === component.getPublicInstance()) {
|
||
|
owner.detachRef(ref);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
module.exports = ReactOwner;
|