From 41442dc0e007edd093de91480cd1fcfa7126b8de Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Fri, 5 Apr 2024 20:58:30 +0100 Subject: [PATCH] fix bugs --- .../src/internal/client/dom/blocks/each.js | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index b997c0525f..ff9640353d 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -49,23 +49,30 @@ export function set_current_each_item(item) { * @param {null | Node} controlled_anchor */ function pause_effects(items, paused, controlled_anchor) { - /** @type {import('#client').TransitionManager[]} */ - var transitions = []; var length = items.length; - var transitions_count; + var has_transitions = false; + var to_destoy = []; for (var i = 0; i < length; i++) { - var item = items[i]; - transitions_count = transitions.length; + const item = items[i]; + /** @type {import('#client').TransitionManager[]} */ + const transitions = []; pause_children(item.e, transitions, true); - if (transitions_count !== transitions.length) { - paused.set(item.k, item); + if (transitions.length > 0) { + has_transitions = true; + + run_out_transitions(transitions, () => { + paused.delete(item.k); + destroy_effect(item.e); + }); + } else { + to_destoy.push(item); } } // If we have a controlled anchor, it means that the each block is inside a single // DOM element, so we can apply a fast-path for clearing the contents of the element. - if (items.length > 0 && transitions.length === 0) { + if (items.length > 0 && !has_transitions) { if (controlled_anchor !== null) { var parent_node = /** @type {Element} */ (controlled_anchor.parentNode); parent_node.textContent = ''; @@ -73,13 +80,11 @@ function pause_effects(items, paused, controlled_anchor) { } } - run_out_transitions(transitions, () => { - for (var i = 0; i < length; i++) { - var item = items[i]; - paused.delete(item.k); - destroy_effect(item.e); - } - }); + for (i = 0; i < to_destoy.length; i++) { + var item = to_destoy[i]; + paused.delete(item.k); + destroy_effect(item.e); + } } /**