Skip to content

Commit

Permalink
fix: ensure child effects are removed from parent branches (#10985)
Browse files Browse the repository at this point in the history
* fix: ensure child effects are removed from parent branches

* fix: child effects are removed from parent branches

* oops
  • Loading branch information
trueadm committed Mar 29, 2024
1 parent 5b2d521 commit b119600
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 12 deletions.
5 changes: 5 additions & 0 deletions .changeset/silly-lies-film.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"svelte": patch
---

fix: child effects are removed from parent branches
19 changes: 11 additions & 8 deletions packages/svelte/src/internal/client/reactivity/deriveds.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,19 +70,22 @@ export function derived_safe_equal(fn) {
* @returns {void}
*/
function destroy_derived_children(signal) {
var effects = signal.effects;

// TODO: should it be possible to create effects in deriveds given they're meant to be pure?
if (signal.effects) {
for (var i = 0; i < signal.effects.length; i += 1) {
destroy_effect(signal.effects[i]);
}
if (effects !== null) {
signal.effects = null;
for (var i = 0; i < effects.length; i += 1) {
destroy_effect(effects[i]);
}
}
var deriveds = signal.deriveds;

if (signal.deriveds) {
for (i = 0; i < signal.deriveds.length; i += 1) {
destroy_derived(signal.deriveds[i]);
}
if (deriveds !== null) {
signal.deriveds = null;
for (i = 0; i < deriveds.length; i += 1) {
destroy_derived(deriveds[i]);
}
}
}

Expand Down
11 changes: 11 additions & 0 deletions packages/svelte/src/internal/client/reactivity/effects.js
Original file line number Diff line number Diff line change
Expand Up @@ -237,11 +237,22 @@ export function destroy_effect(effect) {
remove(effect.dom);
}

var parent = effect.parent;

if (parent !== null && (effect.f & BRANCH_EFFECT) !== 0) {
var effects = parent.effects;
if (effects !== null) {
var index = effects.indexOf(effect);
effects.splice(index, 1);
}
}

effect.effects =
effect.teardown =
effect.ctx =
effect.dom =
effect.deps =
effect.parent =
// @ts-expect-error
effect.fn =
null;
Expand Down
10 changes: 6 additions & 4 deletions packages/svelte/src/internal/client/runtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -353,11 +353,13 @@ export function remove_reactions(signal, start_index) {
* @returns {void}
*/
export function destroy_children(signal) {
if (signal.effects) {
for (var i = 0; i < signal.effects.length; i += 1) {
destroy_effect(signal.effects[i]);
}
var effects = signal.effects;

if (effects !== null) {
signal.effects = null;
for (var i = 0; i < effects.length; i += 1) {
destroy_effect(effects[i]);
}
}
}

Expand Down

0 comments on commit b119600

Please sign in to comment.