diff --git a/src/core/ReactComponent.js b/src/core/ReactComponent.js
index d8c883b6d4..2f048502e6 100644
--- a/src/core/ReactComponent.js
+++ b/src/core/ReactComponent.js
@@ -278,6 +278,10 @@ var ReactComponent = {
'`render` method to pass the correct value as props to the component ' +
'where it is created.'
);
+ invariant(
+ this.isMounted(),
+ 'replaceProps(...): Can only update a mounted component.'
+ );
this._pendingProps = props;
ReactUpdates.enqueueUpdate(this, callback);
},
diff --git a/src/core/ReactCompositeComponent.js b/src/core/ReactCompositeComponent.js
index 01c1ccbb5d..4bb6a4fedd 100644
--- a/src/core/ReactCompositeComponent.js
+++ b/src/core/ReactCompositeComponent.js
@@ -726,11 +726,6 @@ var ReactCompositeComponentMixin = {
ReactComponent.Mixin.updateComponent.call(this, transaction, prevProps);
var currentComponent = this._renderedComponent;
var nextComponent = this._renderValidatedComponent();
- invariant(
- typeof currentComponent !== 'undefined',
- 'updateComponent(...): You are attempting to update an unrendered ' +
- 'component.'
- );
if (currentComponent.constructor === nextComponent.constructor) {
currentComponent.receiveProps(nextComponent.props, transaction);
} else {
diff --git a/src/core/__tests__/ReactComponentLifeCycle-test.js b/src/core/__tests__/ReactComponentLifeCycle-test.js
index 3f2df5e82e..62aab8f14a 100644
--- a/src/core/__tests__/ReactComponentLifeCycle-test.js
+++ b/src/core/__tests__/ReactComponentLifeCycle-test.js
@@ -408,6 +408,26 @@ describe('ReactComponentLifeCycle', function() {
.toThrow();
});
+ it('should throw when calling setProps() on an unmounted component', function() {
+ var PropsToUpdate = React.createClass({
+ render: function() {
+ return (
+
+
+ );
+ }
+ });
+ var instance =
+ ;
+ expect(function() {
+ instance.setProps({value: "goodbye"});
+ }).toThrow();
+ });
+
it('should allow state updates in componentDidMount', function() {
/**
* calls setState in an componentDidMount.