Skip to content

Commit b119600

Browse files
authored
fix: ensure child effects are removed from parent branches (#10985)
* fix: ensure child effects are removed from parent branches * fix: child effects are removed from parent branches * oops
1 parent 5b2d521 commit b119600

File tree

4 files changed

+33
-12
lines changed

4 files changed

+33
-12
lines changed

.changeset/silly-lies-film.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: child effects are removed from parent branches

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,22 @@ export function derived_safe_equal(fn) {
7070
* @returns {void}
7171
*/
7272
function destroy_derived_children(signal) {
73+
var effects = signal.effects;
74+
7375
// TODO: should it be possible to create effects in deriveds given they're meant to be pure?
74-
if (signal.effects) {
75-
for (var i = 0; i < signal.effects.length; i += 1) {
76-
destroy_effect(signal.effects[i]);
77-
}
76+
if (effects !== null) {
7877
signal.effects = null;
78+
for (var i = 0; i < effects.length; i += 1) {
79+
destroy_effect(effects[i]);
80+
}
7981
}
82+
var deriveds = signal.deriveds;
8083

81-
if (signal.deriveds) {
82-
for (i = 0; i < signal.deriveds.length; i += 1) {
83-
destroy_derived(signal.deriveds[i]);
84-
}
84+
if (deriveds !== null) {
8585
signal.deriveds = null;
86+
for (i = 0; i < deriveds.length; i += 1) {
87+
destroy_derived(deriveds[i]);
88+
}
8689
}
8790
}
8891

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,22 @@ export function destroy_effect(effect) {
237237
remove(effect.dom);
238238
}
239239

240+
var parent = effect.parent;
241+
242+
if (parent !== null && (effect.f & BRANCH_EFFECT) !== 0) {
243+
var effects = parent.effects;
244+
if (effects !== null) {
245+
var index = effects.indexOf(effect);
246+
effects.splice(index, 1);
247+
}
248+
}
249+
240250
effect.effects =
241251
effect.teardown =
242252
effect.ctx =
243253
effect.dom =
244254
effect.deps =
255+
effect.parent =
245256
// @ts-expect-error
246257
effect.fn =
247258
null;

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -353,11 +353,13 @@ export function remove_reactions(signal, start_index) {
353353
* @returns {void}
354354
*/
355355
export function destroy_children(signal) {
356-
if (signal.effects) {
357-
for (var i = 0; i < signal.effects.length; i += 1) {
358-
destroy_effect(signal.effects[i]);
359-
}
356+
var effects = signal.effects;
357+
358+
if (effects !== null) {
360359
signal.effects = null;
360+
for (var i = 0; i < effects.length; i += 1) {
361+
destroy_effect(effects[i]);
362+
}
361363
}
362364
}
363365

0 commit comments

Comments
 (0)