Why doesn't this assignment cause an infinite loop in $effect()? #16931
-
I have this Svelte 5 component: <script lang="ts"> type Props = { player: Player; messages: string[]; }; let { player = $bindable(), messages = $bindable() }: Props = $props(); $effect(() => { const selected: string[] = []; if (player.skills?.some((s) => s.one)) selected.push('One'); if (player.skills?.some((s) => s.two)) selected.push('Two'); if (player.skills?.some((s) => s.three)) selected.push('Three'); messages.push(`Please verify: ${selected.join(', ')}`); }); </script> {#each player.skills || [] as skill, i (skill.id)} <Skill bind:skill={player.skills[i]} /> {/each} but when I check a skill.one/two and so on (boolean values) in one of the If I use the below code instead it works. $effect(() => { // The same as before messages = selected.length ? [`Please verify: ${selected.join(', ')}`] : []; }); Why doesn't assignment cause an infinite loop? |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 2 replies
-
The assignment on the other hand does not perform any reads, thus not creating a dependency on (You can use |
Beta Was this translation helpful? Give feedback.
messages.push
is a read operation onmessages
andpush
also reads thelength
while at the same time modifying thelength
. The combination of reading and writing causes the loop.The assignment on the other hand does not perform any reads, thus not creating a dependency on
messages
.(You can use
$inspect.trace()
inside an effect to check the dependencies. This will showmessages.length
in your looping code.)