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.
121 lines
3.5 KiB
121 lines
3.5 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 ReactReconciler
|
||
|
*/
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
var ReactRef = require("./ReactRef");
|
||
|
var ReactElementValidator = require("./ReactElementValidator");
|
||
|
|
||
|
/**
|
||
|
* Helper to call ReactRef.attachRefs with this composite component, split out
|
||
|
* to avoid allocations in the transaction mount-ready queue.
|
||
|
*/
|
||
|
function attachRefs() {
|
||
|
ReactRef.attachRefs(this, this._currentElement);
|
||
|
}
|
||
|
|
||
|
var ReactReconciler = {
|
||
|
|
||
|
/**
|
||
|
* Initializes the component, renders markup, and registers event listeners.
|
||
|
*
|
||
|
* @param {ReactComponent} internalInstance
|
||
|
* @param {string} rootID DOM ID of the root node.
|
||
|
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
|
||
|
* @return {?string} Rendered markup to be inserted into the DOM.
|
||
|
* @final
|
||
|
* @internal
|
||
|
*/
|
||
|
mountComponent: function(internalInstance, rootID, transaction, context) {
|
||
|
var markup = internalInstance.mountComponent(rootID, transaction, context);
|
||
|
if ("production" !== process.env.NODE_ENV) {
|
||
|
ReactElementValidator.checkAndWarnForMutatedProps(
|
||
|
internalInstance._currentElement
|
||
|
);
|
||
|
}
|
||
|
transaction.getReactMountReady().enqueue(attachRefs, internalInstance);
|
||
|
return markup;
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Releases any resources allocated by `mountComponent`.
|
||
|
*
|
||
|
* @final
|
||
|
* @internal
|
||
|
*/
|
||
|
unmountComponent: function(internalInstance) {
|
||
|
ReactRef.detachRefs(internalInstance, internalInstance._currentElement);
|
||
|
internalInstance.unmountComponent();
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Update a component using a new element.
|
||
|
*
|
||
|
* @param {ReactComponent} internalInstance
|
||
|
* @param {ReactElement} nextElement
|
||
|
* @param {ReactReconcileTransaction} transaction
|
||
|
* @param {object} context
|
||
|
* @internal
|
||
|
*/
|
||
|
receiveComponent: function(
|
||
|
internalInstance, nextElement, transaction, context
|
||
|
) {
|
||
|
var prevElement = internalInstance._currentElement;
|
||
|
|
||
|
if (nextElement === prevElement && nextElement._owner != null) {
|
||
|
// Since elements are immutable after the owner is rendered,
|
||
|
// we can do a cheap identity compare here to determine if this is a
|
||
|
// superfluous reconcile. It's possible for state to be mutable but such
|
||
|
// change should trigger an update of the owner which would recreate
|
||
|
// the element. We explicitly check for the existence of an owner since
|
||
|
// it's possible for an element created outside a composite to be
|
||
|
// deeply mutated and reused.
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ("production" !== process.env.NODE_ENV) {
|
||
|
ReactElementValidator.checkAndWarnForMutatedProps(nextElement);
|
||
|
}
|
||
|
|
||
|
var refsChanged = ReactRef.shouldUpdateRefs(
|
||
|
prevElement,
|
||
|
nextElement
|
||
|
);
|
||
|
|
||
|
if (refsChanged) {
|
||
|
ReactRef.detachRefs(internalInstance, prevElement);
|
||
|
}
|
||
|
|
||
|
internalInstance.receiveComponent(nextElement, transaction, context);
|
||
|
|
||
|
if (refsChanged) {
|
||
|
transaction.getReactMountReady().enqueue(attachRefs, internalInstance);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Flush any dirty changes in a component.
|
||
|
*
|
||
|
* @param {ReactComponent} internalInstance
|
||
|
* @param {ReactReconcileTransaction} transaction
|
||
|
* @internal
|
||
|
*/
|
||
|
performUpdateIfNecessary: function(
|
||
|
internalInstance,
|
||
|
transaction
|
||
|
) {
|
||
|
internalInstance.performUpdateIfNecessary(transaction);
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
module.exports = ReactReconciler;
|