From 4c3405268ee87dfdf72b0d88cada6c7c736a93cf Mon Sep 17 00:00:00 2001 From: Andreas Svensson Date: Thu, 24 Jul 2014 14:44:03 +0200 Subject: [PATCH] Temporary workaround for use of purged ID in updateComponent --- src/browser/ui/ReactDOMIDOperations.js | 8 ++++++-- src/core/ReactCompositeComponent.js | 25 +++++++++++++++++-------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/browser/ui/ReactDOMIDOperations.js b/src/browser/ui/ReactDOMIDOperations.js index ea206cd065b90..8d627cdd9c0d3 100644 --- a/src/browser/ui/ReactDOMIDOperations.js +++ b/src/browser/ui/ReactDOMIDOperations.js @@ -161,9 +161,13 @@ var ReactDOMIDOperations = { dangerouslyReplaceNodeWithMarkupByID: ReactPerf.measure( 'ReactDOMIDOperations', 'dangerouslyReplaceNodeWithMarkupByID', - function(id, markup) { + function(id, markupCallback) { var node = ReactMount.getNode(id); - DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup(node, markup); + var markup = markupCallback(); + DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup( + node, + markup + ); } ), diff --git a/src/core/ReactCompositeComponent.js b/src/core/ReactCompositeComponent.js index 0517820490c20..3a4d1ea25bcb3 100644 --- a/src/core/ReactCompositeComponent.js +++ b/src/core/ReactCompositeComponent.js @@ -1167,16 +1167,25 @@ var ReactCompositeComponentMixin = { // These two IDs are actually the same! But nothing should rely on that. var thisID = this._rootNodeID; var prevComponentID = prevComponentInstance._rootNodeID; - prevComponentInstance.unmountComponent(); - this._renderedComponent = instantiateReactComponent(nextDescriptor); - var nextMarkup = this._renderedComponent.mountComponent( - thisID, - transaction, - this._mountDepth + 1 - ); + + // This callback pattern is a temporary workaround until a refactor is + // carried out. The problem it solves is that even though prevComponent + // was unmounted (and its ID purged), its ID would later be used for + // dangerouslyReplaceNodeWithMarkupByID. + var thisComponent = this; ReactComponent.BackendIDOperations.dangerouslyReplaceNodeWithMarkupByID( prevComponentID, - nextMarkup + function() { + prevComponentInstance.unmountComponent(); + thisComponent._renderedComponent = + instantiateReactComponent(nextDescriptor); + var nextMarkup = thisComponent._renderedComponent.mountComponent( + thisID, + transaction, + thisComponent._mountDepth + 1 + ); + return nextMarkup; + } ); } }