Skip to content

Commit 3ff144b

Browse files
committed
fix: ensure component root effect updates occur first
1 parent cd56c1d commit 3ff144b

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

.changeset/kind-schools-share.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: ensure component root effect updates occur first

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ import {
3232
HEAD_EFFECT,
3333
MAYBE_DIRTY,
3434
EFFECT_HAS_DERIVED,
35-
BOUNDARY_EFFECT
35+
BOUNDARY_EFFECT,
36+
DISCONNECTED
3637
} from '../constants.js';
3738
import { set } from './sources.js';
3839
import * as e from '../errors.js';
@@ -229,7 +230,7 @@ export function inspect_effect(fn) {
229230
* @returns {() => void}
230231
*/
231232
export function effect_root(fn) {
232-
const effect = create_effect(ROOT_EFFECT, fn, true);
233+
const effect = create_effect(ROOT_EFFECT | DISCONNECTED, fn, true);
233234

234235
return () => {
235236
destroy_effect(effect);

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

+8-1
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,14 @@ export function schedule_effect(signal) {
738738
}
739739
}
740740

741-
queued_root_effects.push(effect);
741+
// Schedule the root effect for component trees first so any updates
742+
// that affect the component tree occur first. Root effects that are
743+
// not for component trees (i.e. $effect.root) will be marked as disconnected
744+
if ((effect.f & DISCONNECTED) === 0) {
745+
queued_root_effects.unshift(effect);
746+
} else {
747+
queued_root_effects.push(effect);
748+
}
742749
}
743750

744751
/**

0 commit comments

Comments
 (0)