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.
120 lines
3.5 KiB
120 lines
3.5 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 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;
|
|
|