From ad599103c48f45bf00606568012290bf2f09b331 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 14 Dec 2023 15:00:53 +0000 Subject: [PATCH] add test --- .changeset/wild-foxes-wonder.md | 5 ++ packages/svelte/src/internal/client/each.js | 26 +++++--- .../samples/animation-flip-2/_config.js | 60 +++++++++++++++++++ .../samples/animation-flip-2/main.svelte | 28 +++++++++ 4 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 .changeset/wild-foxes-wonder.md create mode 100644 packages/svelte/tests/runtime-legacy/samples/animation-flip-2/_config.js create mode 100644 packages/svelte/tests/runtime-legacy/samples/animation-flip-2/main.svelte diff --git a/.changeset/wild-foxes-wonder.md b/.changeset/wild-foxes-wonder.md new file mode 100644 index 0000000000..b7e5760868 --- /dev/null +++ b/.changeset/wild-foxes-wonder.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: cleanup each block animations on destroy diff --git a/packages/svelte/src/internal/client/each.js b/packages/svelte/src/internal/client/each.js index c37183d7bf..e493241fed 100644 --- a/packages/svelte/src/internal/client/each.js +++ b/packages/svelte/src/internal/client/each.js @@ -744,17 +744,27 @@ export function destroy_each_item_block( const transitions = block.s; if (apply_transitions && transitions !== null) { - trigger_transitions(transitions, 'out'); - if (transition_block !== null) { - transition_block.push(block); + // We might have pending key transitions, if so remove them first + for (let other of transitions) { + if (other.r === 'key') { + transitions.delete(other); + } } - } else { - const dom = block.d; - if (!controlled && dom !== null) { - remove(dom); + if (transitions.size === 0) { + block.s = null; + } else { + trigger_transitions(transitions, 'out'); + if (transition_block !== null) { + transition_block.push(block); + } + return; } - destroy_signal(/** @type {import('./types.js').EffectSignal} */ (block.e)); } + const dom = block.d; + if (!controlled && dom !== null) { + remove(dom); + } + destroy_signal(/** @type {import('./types.js').EffectSignal} */ (block.e)); } /** diff --git a/packages/svelte/tests/runtime-legacy/samples/animation-flip-2/_config.js b/packages/svelte/tests/runtime-legacy/samples/animation-flip-2/_config.js new file mode 100644 index 0000000000..28238df402 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/animation-flip-2/_config.js @@ -0,0 +1,60 @@ +import { flushSync } from 'svelte'; +import { ok, test } from '../../test'; + +export default test({ + async test({ assert, target, window }) { + const button = target.querySelector('button'); + ok(button); + + assert.htmlEqual( + target.innerHTML, + ` +
` + ); + + flushSync(() => { + button.click(); + }); + + assert.htmlEqual( + target.innerHTML, + ` +
` + ); + } +}); diff --git a/packages/svelte/tests/runtime-legacy/samples/animation-flip-2/main.svelte b/packages/svelte/tests/runtime-legacy/samples/animation-flip-2/main.svelte new file mode 100644 index 0000000000..99795007e8 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/animation-flip-2/main.svelte @@ -0,0 +1,28 @@ + + + + +
+ {#each todos as todo (todo.id)} + + {/each} +