Skip to content

Commit 09510c8

Browse files
authored
fix: address regression with untrack (#15079)
* fix: address regression with untrack * add test
1 parent c75f1f5 commit 09510c8

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

.changeset/ninety-chefs-know.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: address regression with untrack

packages/svelte/src/internal/client/reactivity/sources.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export function mutable_state(v, immutable = false) {
116116
*/
117117
/*#__NO_SIDE_EFFECTS__*/
118118
function push_derived_source(source) {
119-
if (active_reaction !== null && (active_reaction.f & DERIVED) !== 0) {
119+
if (active_reaction !== null && !untracking && (active_reaction.f & DERIVED) !== 0) {
120120
if (derived_sources === null) {
121121
set_derived_sources([source]);
122122
} else {
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+
html: `3`
5+
});
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<script module>
2+
import { untrack } from 'svelte'
3+
import { SvelteMap } from 'svelte/reactivity'
4+
5+
class Foo {
6+
id
7+
updateTime = $state(Date.now())
8+
9+
constructor(id) {
10+
this.id = id
11+
}
12+
}
13+
14+
class Store {
15+
cache = new SvelteMap()
16+
ids = $state([1, 2, 3])
17+
18+
getOrDefault(id) {
19+
let ret = this.cache.get(id)
20+
21+
if (ret) {
22+
return ret
23+
}
24+
25+
ret = untrack(() => {
26+
ret = new Foo(id)
27+
this.cache.set(id, ret)
28+
return ret
29+
})
30+
this.cache.get(id)
31+
32+
return ret
33+
}
34+
35+
get values() {
36+
return this.ids.map(id => this.getOrDefault(id)).sort((a, b) => b.updateTime - a.updateTime)
37+
}
38+
}
39+
40+
const store = new Store()
41+
</script>
42+
43+
<script>
44+
const test = $derived.by(() => store.values.length)
45+
</script>
46+
47+
{test}

0 commit comments

Comments
 (0)