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 @@
+
+
+