diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index 7e2a4e49b7..013f487963 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -42,7 +42,8 @@ import { legacy_updates, set_cv, get_cv, - active_batch + active_batch, + current_batch } from './batch.js'; import { proxy } from '../proxy.js'; import { execute_derived } from './deriveds.js'; @@ -334,21 +335,19 @@ export function mark_reactions(signal, wv, updated_during_traversal) { continue; } + // TODO ideally this would work, but I think we need to `apply()` before `mark_reactions`. + // Or pass `batch` in as an argument? + // if (wv <= get_cv(reaction)) continue; + if ((flags & DERIVED) !== 0) { var derived = /** @type {Derived} */ (reaction); if (wv > get_cv(derived)) { + current_batch?.current?.delete(derived); // TODO would be nice if `batch` was passed in and we weren't doing this active_batch?.values?.delete(derived); derived.f &= ~CLEAN; - if ((flags & WAS_MARKED) === 0) { - // Only connected deriveds can be reliably unmarked right away - if (flags & CONNECTED) { - reaction.f |= WAS_MARKED; - } - - mark_reactions(derived, wv, updated_during_traversal); - } + mark_reactions(derived, wv, updated_during_traversal); } } else { var effect = /** @type {Effect} */ (reaction);