From 4fbd2a6f104e5f458264a129c39dac469717da2a Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 24 Oct 2024 13:20:04 +0100 Subject: [PATCH] fix: ensure props internally untracks current_value on sets (#13859) * fix: ensure props internally untracks current_value on sets * Update packages/svelte/src/internal/client/reactivity/props.js --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/short-jokes-speak.md | 5 +++++ .../src/internal/client/reactivity/props.js | 7 ++----- .../samples/props-assignment-tracking/_config.js | 16 ++++++++++++++++ .../props-assignment-tracking/main.svelte | 10 ++++++++++ 4 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 .changeset/short-jokes-speak.md create mode 100644 packages/svelte/tests/runtime-runes/samples/props-assignment-tracking/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/props-assignment-tracking/main.svelte diff --git a/.changeset/short-jokes-speak.md b/.changeset/short-jokes-speak.md new file mode 100644 index 0000000000..0b2552e29b --- /dev/null +++ b/.changeset/short-jokes-speak.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: ensure props internally untracks current_value on sets diff --git a/packages/svelte/src/internal/client/reactivity/props.js b/packages/svelte/src/internal/client/reactivity/props.js index 32969139bf..1d0f7b239f 100644 --- a/packages/svelte/src/internal/client/reactivity/props.js +++ b/packages/svelte/src/internal/client/reactivity/props.js @@ -373,8 +373,6 @@ export function prop(props, key, flags, fallback) { if (!immutable) current_value.equals = safe_equals; return function (/** @type {any} */ value, /** @type {boolean} */ mutation) { - var current = get(current_value); - // legacy nonsense — need to ensure the source is invalidated when necessary // also needed for when handling inspect logic so we can inspect the correct source signal if (is_signals_recorded) { @@ -398,12 +396,11 @@ export function prop(props, key, flags, fallback) { if (fallback_used && fallback_value !== undefined) { fallback_value = new_value; } - get(current_value); // force a synchronisation immediately + untrack(() => get(current_value)); // force a synchronisation immediately } return value; } - - return current; + return get(current_value); }; } diff --git a/packages/svelte/tests/runtime-runes/samples/props-assignment-tracking/_config.js b/packages/svelte/tests/runtime-runes/samples/props-assignment-tracking/_config.js new file mode 100644 index 0000000000..f08a40706f --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/props-assignment-tracking/_config.js @@ -0,0 +1,16 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + test({ assert, logs, target }) { + const btn = target.querySelector('button'); + + flushSync(() => { + btn?.click(); + btn?.click(); + btn?.click(); + }); + + assert.deepEqual(logs, ['effect']); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/props-assignment-tracking/main.svelte b/packages/svelte/tests/runtime-runes/samples/props-assignment-tracking/main.svelte new file mode 100644 index 0000000000..4a21fa6801 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/props-assignment-tracking/main.svelte @@ -0,0 +1,10 @@ + + +