Skip to content

Commit 85e6f6d

Browse files
committed
fix: make $effect.tracking consistent between in and out transitions
1 parent 4a0c90e commit 85e6f6d

File tree

4 files changed

+52
-8
lines changed

4 files changed

+52
-8
lines changed

.changeset/rare-apes-dream.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: make `$effect.tracking` consistent between in and out transitions

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

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import {
1515
set_is_destroying_effect,
1616
set_is_flushing_effect,
1717
set_signal_status,
18-
untrack
18+
untrack,
19+
set_active_effect
1920
} from '../runtime.js';
2021
import {
2122
DIRTY,
@@ -518,14 +519,23 @@ export function pause_effect(effect, callback) {
518519
* @param {() => void} fn
519520
*/
520521
export function run_out_transitions(transitions, fn) {
521-
var remaining = transitions.length;
522-
if (remaining > 0) {
523-
var check = () => --remaining || fn();
524-
for (var transition of transitions) {
525-
transition.out(check);
522+
let prev_active_effect = active_effect;
523+
let prev_active_reaction = active_reaction;
524+
set_active_reaction(null);
525+
set_active_effect(null);
526+
try {
527+
var remaining = transitions.length;
528+
if (remaining > 0) {
529+
var check = () => --remaining || fn();
530+
for (var transition of transitions) {
531+
transition.out(check);
532+
}
533+
} else {
534+
fn();
526535
}
527-
} else {
528-
fn();
536+
} finally {
537+
set_active_effect(prev_active_effect);
538+
set_active_reaction(prev_active_reaction);
529539
}
530540
}
531541

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { flushSync } from '../../../../src/index-client.js';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
test({ assert, target, logs }) {
6+
const btn = target.querySelector('button');
7+
flushSync(() => {
8+
btn?.click();
9+
});
10+
assert.deepEqual(logs, [false]);
11+
flushSync(() => {
12+
btn?.click();
13+
});
14+
assert.deepEqual(logs, [false, false]);
15+
}
16+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script>
2+
let visible = $state(0);
3+
4+
function in_and_out() {
5+
console.log($effect.tracking());
6+
}
7+
</script>
8+
9+
<button onclick={() => visible = !visible}></button>
10+
11+
{#if visible}
12+
<div transition:in_and_out></div>
13+
{/if}

0 commit comments

Comments
 (0)