Skip to content

Commit e075adb

Browse files
committed
chore: improve derived ownership model
1 parent 48f0bfc commit e075adb

File tree

4 files changed

+15
-6
lines changed

4 files changed

+15
-6
lines changed

.changeset/nine-vans-admire.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+
chore: improve derived ownership model

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import { inspect_effects, set_inspect_effects } from './sources.js';
3131
*/
3232
/*#__NO_SIDE_EFFECTS__*/
3333
export function derived(fn) {
34-
let flags = DERIVED | DIRTY;
34+
var flags = DERIVED | DIRTY;
3535

3636
if (active_effect === null) {
3737
flags |= UNOWNED;
@@ -58,9 +58,6 @@ export function derived(fn) {
5858
var derived = /** @type {Derived} */ (active_reaction);
5959
(derived.children ??= []).push(signal);
6060
}
61-
if (active_effect !== null) {
62-
(active_effect.deriveds ??= []).push(signal);
63-
}
6461

6562
return signal;
6663
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -801,10 +801,17 @@ export function get(signal) {
801801
set_signal_status(active_effect, DIRTY);
802802
schedule_effect(active_effect);
803803
}
804+
} else if (is_derived) {
805+
var derived = /** @type {Derived} */ (signal);
806+
var parent = derived.parent;
807+
808+
if (parent !== null && !parent.deriveds?.includes(derived)) {
809+
(parent.deriveds ??= []).push(derived);
810+
}
804811
}
805812

806813
if (is_derived) {
807-
var derived = /** @type {Derived} */ (signal);
814+
derived = /** @type {Derived} */ (signal);
808815

809816
if (check_dirtiness(derived)) {
810817
update_derived(derived);

packages/svelte/tests/signals/test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ describe('signals', () => {
488488
assert.equal(a?.deps?.length, 1);
489489
assert.equal(s?.reactions?.length, 1);
490490
destroy();
491-
assert.equal(a?.deps, null);
491+
assert.equal(a?.deps?.length, 1);
492492
assert.equal(s?.reactions, null);
493493
};
494494
});

0 commit comments

Comments
 (0)