diff --git a/.changeset/chatty-papers-sing.md b/.changeset/chatty-papers-sing.md new file mode 100644 index 0000000000..4d85b91bfc --- /dev/null +++ b/.changeset/chatty-papers-sing.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: skip derived re-evaluation inside inert effect blocks diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index 7df7651294..2c9b9da33e 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -10,7 +10,8 @@ import { ASYNC, WAS_MARKED, DESTROYED, - CLEAN + CLEAN, + INERT } from '#client/constants'; import { active_reaction, @@ -305,10 +306,22 @@ function get_derived_parent_effect(derived) { * @returns {T} */ export function execute_derived(derived) { + var parent_effect = get_derived_parent_effect(derived); + + // don't update `{@const ...}` in an outroing block + if ( + !async_mode_flag && + !is_destroying_effect && + parent_effect !== null && + (parent_effect.f & INERT) !== 0 + ) { + return derived.v; + } + var value; var prev_active_effect = active_effect; - set_active_effect(get_derived_parent_effect(derived)); + set_active_effect(parent_effect); if (DEV) { let prev_eager_effects = eager_effects; diff --git a/packages/svelte/tests/runtime-runes/samples/if-block-const-inert-derived/_config.js b/packages/svelte/tests/runtime-runes/samples/if-block-const-inert-derived/_config.js new file mode 100644 index 0000000000..b803182079 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/if-block-const-inert-derived/_config.js @@ -0,0 +1,18 @@ +import { flushSync, tick } from 'svelte'; +import { test } from '../../test'; + +export default test({ + html: '
hello
{result.data}
+