pull/18782/merge
svelte-triage-bot[bot] 18 hours ago committed by GitHub
commit 3f11725856
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: prevent duplicate reactions when reconnecting deriveds

@ -728,7 +728,10 @@ function reconnect(derived) {
if (derived.deps === null) return; if (derived.deps === null) return;
for (const dep of derived.deps) { for (const dep of derived.deps) {
(dep.reactions ??= []).push(derived); var reactions = (dep.reactions ??= []);
if (!includes.call(reactions, derived)) {
reactions.push(derived);
}
if ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) { if ((dep.f & DERIVED) !== 0 && (dep.f & CONNECTED) === 0) {
unfreeze_derived_effects(/** @type {Derived} */ (dep)); unfreeze_derived_effects(/** @type {Derived} */ (dep));

@ -810,6 +810,30 @@ describe('signals', () => {
}; };
}); });
test('deriveds with changed dependencies clean up after reconnection', () => {
const visible = state(true);
const first = state(0);
const second = state(1);
const selected = state(first);
const value = derived(() => $.get($.get(selected)));
return () => {
const destroy = effect_root(() => {
render_effect(() => {
if ($.get(visible)) $.get(value);
});
});
flushSync(() => set(visible, false));
flushSync(() => set(selected, second));
flushSync(() => set(visible, true));
destroy();
assert.equal(second.reactions, null);
};
});
test('deriveds update upon reconnection #1', () => { test('deriveds update upon reconnection #1', () => {
let a = state(false); let a = state(false);
let b = state(false); let b = state(false);

Loading…
Cancel
Save