Skip to content

Commit c10337c

Browse files
authored
fix: improve proxy effect dependency tracking (#10605)
1 parent 6afaf75 commit c10337c

File tree

5 files changed

+49
-3
lines changed

5 files changed

+49
-3
lines changed

.changeset/cold-masks-learn.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: improve proxy effect dependency tracking

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import {
55
update,
66
updating_derived,
77
batch_inspect,
8-
current_component_context
8+
current_component_context,
9+
set_ignore_mutation_validation
910
} from './runtime.js';
1011
import { effect_active } from './reactivity/computations.js';
1112
import {
@@ -182,7 +183,11 @@ const state_proxy_handler = {
182183
}
183184
if (s !== undefined) set(s, UNINITIALIZED);
184185

185-
if (boolean) update(metadata.v);
186+
if (boolean) {
187+
set_ignore_mutation_validation(true);
188+
update(metadata.v);
189+
set_ignore_mutation_validation(false);
190+
}
186191

187192
return boolean;
188193
},
@@ -291,8 +296,9 @@ const state_proxy_handler = {
291296
set(ls, length);
292297
}
293298
}
294-
299+
set_ignore_mutation_validation(true);
295300
update(metadata.v);
301+
set_ignore_mutation_validation(false);
296302
}
297303

298304
return true;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script>
2+
import { getContext } from 'svelte';
3+
4+
let context = getContext('container');
5+
6+
$effect(() => {
7+
context.register('test');
8+
return () => context.unregister('test');
9+
});
10+
</script>
11+
12+
<div>Item</div>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
test({ assert, target }) {
6+
flushSync();
7+
assert.htmlEqual(target.innerHTML, `<div>Item</div>`);
8+
}
9+
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script>
2+
import { setContext } from 'svelte';
3+
4+
import Item from './Item.svelte'
5+
6+
let items = $state({});
7+
8+
setContext('container', {
9+
register: (id) => items[id] = true,
10+
unregister: (id) => delete items[id]
11+
});
12+
</script>
13+
14+
<Item />

0 commit comments

Comments
 (0)