diff --git a/packages/svelte/src/internal/client/dom/blocks/branches.js b/packages/svelte/src/internal/client/dom/blocks/branches.js index 272068a253..1e3c59013d 100644 --- a/packages/svelte/src/internal/client/dom/blocks/branches.js +++ b/packages/svelte/src/internal/client/dom/blocks/branches.js @@ -110,16 +110,14 @@ export class BranchManager { } } - this.#batches.delete(batch); - for (const [b, k] of this.#batches) { - if (b.id > batch.id) { + this.#batches.delete(b); + + if (b === batch) { // keep values for newer batches - continue; + break; } - this.#batches.delete(b); - const offscreen = this.#offscreen.get(k); if (offscreen) { diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 21ec9c833f..f4b462afdd 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -429,10 +429,9 @@ export class Batch { // an if block that contains the last blocking pending effect falsy, // causing the block to no longer be deferred. for (const [reaction, status] of this.#dirty_reactions) { - if ((reaction.f & DERIVED) !== 0) { - set_signal_status(reaction, status); - } else if (status === DIRTY || (reaction.f & DIRTY) === 0) { - set_signal_status(reaction, status); + set_signal_status(reaction, status); + + if ((reaction.f & DERIVED) === 0) { this.schedule(/** @type {Effect} */ (reaction)); } } @@ -585,6 +584,7 @@ export class Batch { } else if (async_mode_flag && (flags & (RENDER_EFFECT | MANAGED_EFFECT)) !== 0) { render_effects.push(effect); } else if (is_dirty(effect)) { + if ((flags & BLOCK_EFFECT) !== 0) this.add_dirty_reaction(effect, MAYBE_DIRTY); update_effect(effect); } @@ -959,7 +959,7 @@ export class Batch { if (current_batch === null) { const batch = (current_batch = new Batch()); - if (!is_processing) { + if (!is_processing && !is_flushing_sync) { queue_micro_task(() => { if (!batch.started) { batch.flush(); diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index edf0474cc8..8ed5b35127 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -421,8 +421,8 @@ export function update_derived(derived) { // to the previous batch, not the new one (which can already exist if an earlier // effect wrote to a source). Not adding it to either can cause bugs, so we add it to both. // See https://github.com/sveltejs/svelte/pull/18117 for more details. - previous_batch?.capture(derived, value, true); current_batch?.capture(derived, value, true); + previous_batch?.capture(derived, value, true); } else { derived.v = value; derived.wv = increment_write_version(); diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index c39184427f..dde93fa581 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -416,6 +416,7 @@ function mark_reactions(signal, status, updated_during_traversal) { } else if ((flags & DERIVED) !== 0) { var derived = /** @type {Derived} */ (reaction); + batch_values?.delete(derived); mark_reactions(derived, MAYBE_DIRTY, updated_during_traversal); } else if (not_dirty) { var effect = /** @type {Effect} */ (reaction);