diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index e07a4e4b5d..2602e66c62 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -4,7 +4,6 @@ import { current_effect, remove_reactions, set_signal_status, - mark_reactions, current_skip_reaction, update_reaction, destroy_effect_children, @@ -100,7 +99,6 @@ export function update_derived(derived) { if (!derived.equals(value)) { derived.v = value; derived.version = increment_version(); - mark_reactions(derived, DIRTY, false); } } diff --git a/packages/svelte/src/internal/client/reactivity/effects.js b/packages/svelte/src/internal/client/reactivity/effects.js index 42a51bd006..c0cb2191b9 100644 --- a/packages/svelte/src/internal/client/reactivity/effects.js +++ b/packages/svelte/src/internal/client/reactivity/effects.js @@ -94,7 +94,8 @@ function create_effect(type, fn, sync, push = true) { parent: is_root ? null : current_effect, prev: null, teardown: null, - transitions: null + transitions: null, + version: 0 }; if (DEV) { diff --git a/packages/svelte/src/internal/client/reactivity/types.d.ts b/packages/svelte/src/internal/client/reactivity/types.d.ts index e2c2e9899e..abc2be9015 100644 --- a/packages/svelte/src/internal/client/reactivity/types.d.ts +++ b/packages/svelte/src/internal/client/reactivity/types.d.ts @@ -3,6 +3,8 @@ import type { ComponentContext, Dom, Equals, TemplateNode, TransitionManager } f export interface Signal { /** Flags bitmask */ f: number; + /** Write version */ + version: number; } export interface Value extends Signal { @@ -12,8 +14,6 @@ export interface Value extends Signal { equals: Equals; /** The latest value for this signal */ v: V; - /** Write version */ - version: number; } export interface Reaction extends Signal { diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 646cfc7a30..639d512977 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -163,6 +163,7 @@ export function check_dirtiness(reaction) { return true; } + var is_effect = (flags & EFFECT) !== 0; var is_unowned = (flags & UNOWNED) !== 0; var is_disconnected = (flags & DISCONNECTED) !== 0; @@ -180,8 +181,11 @@ export function check_dirtiness(reaction) { update_derived(/** @type {import('#client').Derived} **/ (dependency)); } - if ((reaction.f & DIRTY) !== 0) { - // `reaction` might now be dirty, as a result of calling `update_derived` + if (dependency.version > reaction.version) { + is_dirty = true; + } + + if (is_effect && is_dirty) { return true; } @@ -190,7 +194,7 @@ export function check_dirtiness(reaction) { // if our dependency write version is higher. If it is then we can assume // that state has changed to a newer version and thus this unowned signal // is also dirty. - if (dependency.version > /** @type {import('#client').Derived} */ (reaction).version) { + if (is_dirty) { return true; } @@ -204,10 +208,6 @@ export function check_dirtiness(reaction) { // It might be that the derived was was dereferenced from its dependencies but has now come alive again. // In thise case, we need to re-attach it to the graph and mark it dirty if any of its dependencies have // changed since. - if (dependency.version > /** @type {import('#client').Derived} */ (reaction).version) { - is_dirty = true; - } - reactions = dependency.reactions; if (reactions === null) { dependency.reactions = [reaction]; @@ -490,6 +490,8 @@ export function update_effect(effect) { execute_effect_teardown(effect); var teardown = update_reaction(effect); effect.teardown = typeof teardown === 'function' ? teardown : null; + + effect.version = current_version; } catch (error) { handle_error(/** @type {Error} */ (error), effect, current_component_context); } finally {