Skip to content

Commit 4dcac41

Browse files
authored
fix: cleanup non-branch effects created inside block effects (#13600)
* fix: cleanup non-branch effects created inside block effects * cleaner
1 parent eafddf4 commit 4dcac41

File tree

4 files changed

+55
-1
lines changed

4 files changed

+55
-1
lines changed

.changeset/eleven-humans-kneel.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: cleanup non-branch effects created inside block effects

packages/svelte/src/internal/client/runtime.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,22 @@ export function destroy_effect_children(signal, remove_dom = false) {
429429
}
430430
}
431431

432+
/**
433+
* @param {Effect} signal
434+
* @returns {void}
435+
*/
436+
export function destroy_block_effect_children(signal) {
437+
var effect = signal.first;
438+
439+
while (effect !== null) {
440+
var next = effect.next;
441+
if ((effect.f & BRANCH_EFFECT) === 0) {
442+
destroy_effect(effect);
443+
}
444+
effect = next;
445+
}
446+
}
447+
432448
/**
433449
* @param {Effect} effect
434450
* @returns {void}
@@ -454,7 +470,9 @@ export function update_effect(effect) {
454470
}
455471

456472
try {
457-
if ((flags & BLOCK_EFFECT) === 0) {
473+
if ((flags & BLOCK_EFFECT) !== 0) {
474+
destroy_block_effect_children(effect);
475+
} else {
458476
destroy_effect_children(effect);
459477
}
460478

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
async test({ assert, target, instance, logs }) {
6+
const button = target.querySelector('button');
7+
assert.deepEqual(logs, ['effect', 1]);
8+
flushSync(() => {
9+
button?.click();
10+
});
11+
assert.deepEqual(logs, ['effect', 1, 'clean', 1, 'effect', 2]);
12+
}
13+
});
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<script>
2+
let count = $state(1);
3+
function track(value){
4+
let val = value;
5+
$effect(() => {
6+
console.log("effect", val);
7+
return ()=>{
8+
console.log("clean", val);
9+
}
10+
});
11+
return value;
12+
}
13+
</script>
14+
15+
{#if track(count)}
16+
{/if}
17+
18+
<button onclick={()=> count++}></button>

0 commit comments

Comments
 (0)