From 6b9fc81b642df27d43327e1cc606867ba5cddab4 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 23 Sep 2013 11:19:46 -0400 Subject: [PATCH] Space optimizations for ReactMount.findComponentRoot. --- src/core/ReactMount.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/core/ReactMount.js b/src/core/ReactMount.js index 5d636a0a95..3dff445bc5 100644 --- a/src/core/ReactMount.js +++ b/src/core/ReactMount.js @@ -46,6 +46,9 @@ if (__DEV__) { var rootElementsByReactRootID = {}; } +/** Used to store breadth-first search state in findComponentRoot. */ +var reusableArray = []; + /** * @param {DOMElement} container DOM element that may contain a React component. * @return {?string} A "reactRoot" ID, if a React component is rendered. @@ -538,15 +541,19 @@ var ReactMount = { * @internal */ findComponentRoot: function(ancestorNode, id) { - var firstChildren = [ancestorNode.firstChild]; + var firstChildren = reusableArray; var childIndex = 0; + firstChildren.length = 0; + firstChildren.push(ancestorNode.firstChild); + while (childIndex < firstChildren.length) { var child = firstChildren[childIndex++]; while (child) { var childID = ReactMount.getID(child); if (childID) { if (id === childID) { + firstChildren.length = 0; return child; } else if (ReactInstanceHandles.isAncestorIDOf(childID, id)) { // If we find a child whose ID is an ancestor of the given ID, @@ -556,11 +563,6 @@ var ReactMount = { firstChildren.length = childIndex = 0; firstChildren.push(child.firstChild); break; - } else { - // TODO This should not be necessary if the ID hierarchy is - // correct, but is occasionally necessary if the DOM has been - // modified in unexpected ways. - firstChildren.push(child.firstChild); } } else { // If this child had no ID, then there's a chance that it was @@ -574,6 +576,8 @@ var ReactMount = { } } + firstChildren.length = 0; + if (__DEV__) { console.error( 'Error while invoking `findComponentRoot` with the following ' +