-
Notifications
You must be signed in to change notification settings - Fork 47.3k
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
Fix useSyncExternalStoreWithSelector to not call selectors when snapshot hasn't changed #27776
Conversation
This pull request has been automatically marked as stale. If this pull request is still relevant, please leave any comment (for example, "bump"), and we'll keep it open. We are sorry that we haven't been able to prioritize reviewing it yet. Your contribution is very much appreciated. |
bump |
This pull request has been automatically marked as stale. If this pull request is still relevant, please leave any comment (for example, "bump"), and we'll keep it open. We are sorry that we haven't been able to prioritize reviewing it yet. Your contribution is very much appreciated. |
Closing this pull request after a prolonged period of inactivity. If this issue is still present in the latest release, please ask for this pull request to be reopened. Thank you! |
reopen |
Summary
Current implementation of
useSyncExternalStoreWithSelector
calls selectors even if snapshot hasn't changed.Details
Up to 50% of all dispatched actions in the apps that use
redux-saga
orredux-thunk
could be ones that don't change the redux state but start some async logic.Current
redux
implementation notifies listeners when any action is called, even if it does not change the state, and this behavior won't change.Current
react-redux
implementation usesuseSyncExternalStoreWithSelector
from React, which notifies subscribers for each such action even if state hasn't changed, causing all active selectors to be re-evaluated, which is actually a bug ofuseSyncExternalStoreWithSelector
.In huge apps there can be hundreds of subscribed selectors and dozens of actions per second, so this leads to additional CPU usage for no good reason. Especially noticable in
react-native
apps on old android devices.How did you test this change?
I added a test which fails in current version, and fixed it: