Skip to content

Commit 09addad

Browse files
authored
fix: improve handling of unowned derived signal (#11712)
1 parent fba6b56 commit 09addad

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

.changeset/tame-dots-battle.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 handling of unowned derived signal

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,8 +420,8 @@ function remove_reaction(signal, dependency) {
420420
}
421421
}
422422
if (reactions_length === 0 && (dependency.f & UNOWNED) !== 0) {
423-
// If the signal is unowned then we need to make sure to change it to dirty.
424-
set_signal_status(dependency, DIRTY);
423+
// If the signal is unowned then we need to make sure to change it to maybe dirty.
424+
set_signal_status(dependency, MAYBE_DIRTY);
425425
remove_reactions(/** @type {import('#client').Derived} **/ (dependency), 0);
426426
}
427427
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
mode: ['client'],
6+
async test({ assert, target, logs }) {
7+
let [btn1] = target.querySelectorAll('button');
8+
9+
flushSync(() => {
10+
btn1.click();
11+
});
12+
13+
flushSync(() => {
14+
btn1.click();
15+
});
16+
17+
flushSync(() => {
18+
btn1.click();
19+
});
20+
21+
assert.deepEqual(logs, ['recalculating']);
22+
}
23+
});
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<script context="module">
2+
let visible = $state(true);
3+
4+
function toggleVisibility() {
5+
visible = !visible;
6+
}
7+
8+
let unchangedState = $state("unchanged state");
9+
let derived = $derived.by(() => {
10+
console.log("recalculating");
11+
return unchangedState;
12+
});
13+
</script>
14+
15+
<button onclick={toggleVisibility}>Toggle Visibility</button>
16+
{#if visible}
17+
<p>{derived}</p>
18+
{/if}

0 commit comments

Comments
 (0)