fix: make `$effect.tracking` consistent between in and out transitions

transition-out-effect-tracking
paoloricciuti 11 months ago
parent 4a0c90e87d
commit 85e6f6dd5f

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: make `$effect.tracking` consistent between in and out transitions

@ -15,7 +15,8 @@ import {
set_is_destroying_effect,
set_is_flushing_effect,
set_signal_status,
untrack
untrack,
set_active_effect
} from '../runtime.js';
import {
DIRTY,
@ -518,6 +519,11 @@ export function pause_effect(effect, callback) {
* @param {() => void} fn
*/
export function run_out_transitions(transitions, fn) {
let prev_active_effect = active_effect;
let prev_active_reaction = active_reaction;
set_active_reaction(null);
set_active_effect(null);
try {
var remaining = transitions.length;
if (remaining > 0) {
var check = () => --remaining || fn();
@ -527,6 +533,10 @@ export function run_out_transitions(transitions, fn) {
} else {
fn();
}
} finally {
set_active_effect(prev_active_effect);
set_active_reaction(prev_active_reaction);
}
}
/**

@ -0,0 +1,16 @@
import { flushSync } from '../../../../src/index-client.js';
import { test } from '../../test';
export default test({
test({ assert, target, logs }) {
const btn = target.querySelector('button');
flushSync(() => {
btn?.click();
});
assert.deepEqual(logs, [false]);
flushSync(() => {
btn?.click();
});
assert.deepEqual(logs, [false, false]);
}
});

@ -0,0 +1,13 @@
<script>
let visible = $state(0);
function in_and_out() {
console.log($effect.tracking());
}
</script>
<button onclick={() => visible = !visible}></button>
{#if visible}
<div transition:in_and_out></div>
{/if}
Loading…
Cancel
Save