Fix useIntersectionObserver hook in infinite scroll example #406
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Expected behavior
The
load-more-infinite-scrollexample inreact-queryonly loads more results when theloadMoreButtonRefDOM element is within the viewport.The problem
The
load-more-infinite-scrollexample inreact-queryloads results exhaustively, even when theloadMoreButtonRefDOM element is not within the viewport.Root cause
The
useIntersectionObserverhook, which usesuseEffectunder the hood, does not pass any dependencies as the second argument ofuseEffect; therefore, the hook's callback executes upon every render. This means the IntersectionObserver gets instantiated every render - which in turn means IntersectionObserver calls its callback every render, because IntersectionObserver's API specifies that the callback is called upon intersection and upon initial observation. Source: https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#Intersection_observer_concepts_and_usageThe fix
I've passed
[target.current]as the second argument touseEffectinuseIntersectionObserver, so it'll only re-execute when thecurrentvalue of theuseRefhook instance changes.