diff --git a/src/core/ReactMount.js b/src/core/ReactMount.js index 600d720da8..09063f6a45 100644 --- a/src/core/ReactMount.js +++ b/src/core/ReactMount.js @@ -106,11 +106,15 @@ var ReactMount = { renderComponent: function(nextComponent, container) { var prevComponent = instanceByReactRootID[getReactRootID(container)]; if (prevComponent) { - var nextProps = nextComponent.props; - ReactMount.scrollMonitor(container, function() { - prevComponent.replaceProps(nextProps); - }); - return prevComponent; + if (prevComponent.constructor === nextComponent.constructor) { + var nextProps = nextComponent.props; + ReactMount.scrollMonitor(container, function() { + prevComponent.replaceProps(nextProps); + }); + return prevComponent; + } else { + ReactMount.unmountAndReleaseReactRootNode(container); + } } ReactMount.prepareTopLevelEvents(ReactEventTopLevelCallback); diff --git a/src/core/__tests__/ReactMount-test.js b/src/core/__tests__/ReactMount-test.js new file mode 100644 index 0000000000..de7e6d8b58 --- /dev/null +++ b/src/core/__tests__/ReactMount-test.js @@ -0,0 +1,22 @@ +/** + * @jsx React.DOM + * @emails react-core + */ + +"use strict"; + +describe('ReactMount', function() { + var React = require('React'); + var ReactMount = require('ReactMount'); + + it('should render different components in same root', function() { + var container = document.createElement('container'); + document.documentElement.appendChild(container); + + ReactMount.renderComponent(
, container); + expect(container.firstChild.nodeName).toBe('DIV'); + + ReactMount.renderComponent(, container); + expect(container.firstChild.nodeName).toBe('SPAN'); + }); +});