diff --git a/src/renderers/dom/shared/ReactDOMComponent.js b/src/renderers/dom/shared/ReactDOMComponent.js index 97f6e2b1bb..740c2c91f7 100644 --- a/src/renderers/dom/shared/ReactDOMComponent.js +++ b/src/renderers/dom/shared/ReactDOMComponent.js @@ -1147,8 +1147,8 @@ ReactDOMComponent.Mixin = { break; } - ReactDOMComponentTree.uncacheNode(this); this.unmountChildren(); + ReactDOMComponentTree.uncacheNode(this); EventPluginHub.deleteAllListeners(this); ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID); this._rootNodeID = null; diff --git a/src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js b/src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js index 9f6528c35b..dc1eb9a1ae 100644 --- a/src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js +++ b/src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js @@ -865,6 +865,22 @@ describe('ReactDOMComponent', function() { EventPluginHub.getListener(inst, 'onClick') ).toBe(undefined); }); + + it('unmounts children before unsetting DOM node info', function() { + var Inner = React.createClass({ + render: function() { + return ; + }, + componentWillUnmount: function() { + // Should not throw + expect(ReactDOM.findDOMNode(this).nodeName).toBe('SPAN'); + }, + }); + + var container = document.createElement('div'); + ReactDOM.render(
, container); + ReactDOM.unmountComponentAtNode(container); + }); }); describe('onScroll warning', function() {