From 586653935cbd29bb838335d218afa06536779a11 Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Mon, 9 Nov 2015 15:03:21 -0800 Subject: [PATCH] Unmount children before unsetting DOM node info --- src/renderers/dom/shared/ReactDOMComponent.js | 2 +- .../shared/__tests__/ReactDOMComponent-test.js | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) 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() {