prevent callback skipping with triggerOnce and merged refs #747
+41
−1
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.
Description
Fixes #746
This PR fixes a bug where callbacks are skipped when multiple
useInView({ triggerOnce: true })hooks are merged on the same element.Problem
When a callback executes with
triggerOnce: true, it callsunobserve()which removes the callback from the array usingsplice(). This modifies the array duringforEachiteration, causing subsequent callbacks to be skipped.Solution
Copy the callbacks array before iterating using the spread operator:
This prevents the iteration from being affected by array modifications.
Changes
triggerOnceand merged refsTesting
Added a new test that reproduces the bug:
useInViewhooks withtriggerOnce: trueinView: trueBefore fix: Test fails - only hooks 1 and 3 trigger, hook 2 remains
falseAfter fix: Test passes - all 3 hooks trigger correctly : )