Skip to content

Commit 7e58885

Browse files
fix: don't set state withing with_parent in proxy (#16176)
Closes #16164 We can't set everywhere within with_parent otherwise if it's the first time we are reading a derived it could look like we are setting state in a derived (which you are not).
1 parent 931f211 commit 7e58885

File tree

4 files changed

+36
-16
lines changed

4 files changed

+36
-16
lines changed

.changeset/beige-plants-laugh.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: don't set state withing `with_parent` in proxy

packages/svelte/src/internal/client/proxy.js

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,21 +93,19 @@ export function proxy(value) {
9393
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/getOwnPropertyDescriptor#invariants
9494
e.state_descriptors_fixed();
9595
}
96-
97-
with_parent(() => {
98-
var s = sources.get(prop);
99-
100-
if (s === undefined) {
101-
s = source(descriptor.value, stack);
96+
var s = sources.get(prop);
97+
if (s === undefined) {
98+
s = with_parent(() => {
99+
var s = source(descriptor.value, stack);
102100
sources.set(prop, s);
103-
104101
if (DEV && typeof prop === 'string') {
105102
tag(s, get_label(path, prop));
106103
}
107-
} else {
108-
set(s, descriptor.value, true);
109-
}
110-
});
104+
return s;
105+
});
106+
} else {
107+
set(s, descriptor.value, true);
108+
}
111109

112110
return true;
113111
},
@@ -268,11 +266,8 @@ export function proxy(value) {
268266
// object property before writing to that property.
269267
if (s === undefined) {
270268
if (!has || get_descriptor(target, prop)?.writable) {
271-
s = with_parent(() => {
272-
var s = source(undefined, stack);
273-
set(s, proxy(value));
274-
return s;
275-
});
269+
s = with_parent(() => source(undefined, stack));
270+
set(s, proxy(value));
276271

277272
sources.set(prop, s);
278273

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
async test() {}
5+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script>
2+
function with_writes(initialState) {
3+
const derive = $state(initialState)
4+
return derive
5+
}
6+
7+
let data = $state({ example: 'Example' })
8+
let my_derived = $derived(with_writes({ example: data.example }))
9+
10+
$effect(() => {
11+
my_derived.example = 'Bar'
12+
});
13+
</script>
14+
15+
<input bind:value={data.example} />

0 commit comments

Comments
 (0)