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

', + + async test({ assert, target, raf, logs }) { + const [button] = target.querySelectorAll('button'); + + flushSync(() => button.click()); + assert.deepEqual(logs, ['hello']); + + // Let the transition finish and clean up + raf.tick(100); + + assert.htmlEqual(target.innerHTML, ''); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/if-block-const-inert-derived/main.svelte b/packages/svelte/tests/runtime-runes/samples/if-block-const-inert-derived/main.svelte new file mode 100644 index 0000000000..58b34d52b9 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/if-block-const-inert-derived/main.svelte @@ -0,0 +1,32 @@ + + + + +{#if value} + {@const result = compute(value)} + {#if result.ready} +
+

{result.data}

+
+ {/if} +{/if}