-
Notifications
You must be signed in to change notification settings - Fork 47.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ComponentWillUnmount should only ever be invoked once #6613
Conversation
Mostly because we don't have a better idea of whether it is better to just always try/catch or if we can reuse another flag or store where in the tree we left off. |
@@ -132,6 +132,9 @@ var ReactCompositeComponentMixin = { | |||
|
|||
// See ReactUpdates and ReactUpdateQueue. | |||
this._pendingCallbacks = null; | |||
|
|||
// ComponentWillUnmount shall only be called once | |||
this.calledComponentWillUnmount = false; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use underscore for consistency.
008058d
to
a8e64f1
Compare
|
||
expect(function() { | ||
ReactDOM.render(<App ref={setRef} />, container); | ||
stage = 2; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Any reason not to pass stage as a prop to App?
a8e64f1
to
fd43666
Compare
(cherry picked from commit 8dfdac6)
* Initial pass at the easy case of updates (updates that start at the root). * Don't expect an extra componentWillUnmount call It was fixed in #6613. * Remove duplicate expectations from the test * Fix style issues * Make naming consistent throughout the tests * receiveComponent() does not accept safely argument * Assert that lifecycle and refs fire for error message * Add more tests for mounting * Do not call componentWillMount twice on error boundary * Document more of existing behavior in tests * Do not call componentWillUnmount() when aborting mounting Previously, we would call componentWillUnmount() safely on the tree whenever we abort mounting it. However this is likely risky because the tree was never mounted in the first place. People shouldn't hold resources in componentWillMount() so it's safe to say that we can skip componentWillUnmount() if componentDidMount() was never called. Here, we introduce a new flag. If we abort during mounting, we will not call componentWillUnmount(). However if we abort during an update, it is safe to call componentWillUnmount() because the previous tree has been mounted by now. * Consistently display error messages in tests * Add more logging to tests and remove redundant one * Refactor tests * Split complicated tests into smaller ones * Assert clean unmounting * Add assertions about update hooks * Add more tests to document existing behavior and remove irrelevant details * Verify we can recover from error state * Fix lint * Error in boundary’s componentWillMount should propagate up This test is currently failing. * Move calling componentWillMount() into mountComponent() This removes the unnecessary non-recursive skipLifecycle check. It fixes the previously failing test that verifies that if a boundary throws in its own componentWillMount(), the error will propagate. * Remove extra whitespace
It seems that in certain versions of React it was possible for `componentWillMount` to be called more than once. facebook/react#6613 If that happened to a `connect`ed component, it would cause `dispatcher.unregister` to be called again with a token that was already unregistered causing an exception. This `null`s the token field so unregister can only be called once for a given token.
It seems that in certain versions of React it was possible for `componentWillMount` to be called more than once. facebook/react#6613 If that happened to a `connect`ed component, it would cause `dispatcher.unregister` to be called again with a token that was already unregistered causing an exception. This `null`s the token field so unregister can only be called once for a given token.
It seems that in certain versions of React it was possible for `componentWillMount` to be called more than once. facebook/react#6613 If that happened to a `connect`ed component, it would cause `dispatcher.unregister` to be called again with a token that was already unregistered causing an exception. This `null`s the token field so unregister can only be called once for a given token.
* Initial pass at the easy case of updates (updates that start at the root). * Don't expect an extra componentWillUnmount call It was fixed in facebook#6613. * Remove duplicate expectations from the test * Fix style issues * Make naming consistent throughout the tests * receiveComponent() does not accept safely argument * Assert that lifecycle and refs fire for error message * Add more tests for mounting * Do not call componentWillMount twice on error boundary * Document more of existing behavior in tests * Do not call componentWillUnmount() when aborting mounting Previously, we would call componentWillUnmount() safely on the tree whenever we abort mounting it. However this is likely risky because the tree was never mounted in the first place. People shouldn't hold resources in componentWillMount() so it's safe to say that we can skip componentWillUnmount() if componentDidMount() was never called. Here, we introduce a new flag. If we abort during mounting, we will not call componentWillUnmount(). However if we abort during an update, it is safe to call componentWillUnmount() because the previous tree has been mounted by now. * Consistently display error messages in tests * Add more logging to tests and remove redundant one * Refactor tests * Split complicated tests into smaller ones * Assert clean unmounting * Add assertions about update hooks * Add more tests to document existing behavior and remove irrelevant details * Verify we can recover from error state * Fix lint * Error in boundary’s componentWillMount should propagate up This test is currently failing. * Move calling componentWillMount() into mountComponent() This removes the unnecessary non-recursive skipLifecycle check. It fixes the previously failing test that verifies that if a boundary throws in its own componentWillMount(), the error will propagate. * Remove extra whitespace
ComponentWillUnmount should only ever be invoked once