diff --git a/.changeset/wise-emus-hunt.md b/.changeset/wise-emus-hunt.md new file mode 100644 index 0000000000..c8b3f93de8 --- /dev/null +++ b/.changeset/wise-emus-hunt.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: avoid unnecessary block effect re-runs after async work completes diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index c4caf8a20b..5647c08ba5 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -243,7 +243,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.#dirty_effects.add(effect); + if ((flags & BLOCK_EFFECT) !== 0) this.#maybe_dirty_effects.add(effect); update_effect(effect); } diff --git a/packages/svelte/tests/runtime-runes/samples/async-await-store-mutate/_config.js b/packages/svelte/tests/runtime-runes/samples/async-await-store-mutate/_config.js new file mode 100644 index 0000000000..e89065865f --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-await-store-mutate/_config.js @@ -0,0 +1,24 @@ +import { tick } from 'svelte'; +import { test } from '../../test'; + +// ensure in-place object mutations stay reactive in async +export default test({ + skip_no_async: true, + async test({ assert, target }) { + const button = /** @type {HTMLElement} */ (target.querySelector('button')); + + await tick(); + + assert.htmlEqual(target.innerHTML, `
count: 1, computed: 10
`); + + button.click(); + await tick(); + + assert.htmlEqual(target.innerHTML, `count: 2, computed: 20
`); + + button.click(); + await tick(); + + assert.htmlEqual(target.innerHTML, `count: 3, computed: 30
`); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/async-await-store-mutate/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-await-store-mutate/main.svelte new file mode 100644 index 0000000000..327c775d6e --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/async-await-store-mutate/main.svelte @@ -0,0 +1,26 @@ + + +count: {$data.count}, computed: {await compute($data)}
+ + {#snippet pending()} +pending
+ {/snippet} +pending
+ {/snippet} +