fix: make `$effect.active()` true when updating deriveds

effect-active-derived-allow-unowned
Rich Harris 1 year ago
parent 85d680582b
commit 1f76e87d85

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: make `$effect.active()` true when updating deriveds

@ -26,7 +26,8 @@ import {
EFFECT_RAN, EFFECT_RAN,
BLOCK_EFFECT, BLOCK_EFFECT,
ROOT_EFFECT, ROOT_EFFECT,
EFFECT_TRANSPARENT EFFECT_TRANSPARENT,
DERIVED
} from '../constants.js'; } from '../constants.js';
import { set } from './sources.js'; import { set } from './sources.js';
import { remove } from '../dom/reconciler.js'; import { remove } from '../dom/reconciler.js';
@ -118,7 +119,9 @@ function create_effect(type, fn, sync) {
* @returns {boolean} * @returns {boolean}
*/ */
export function effect_active() { export function effect_active() {
return current_effect ? (current_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 : false; if (current_effect) return (current_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0;
if (current_reaction) return (current_reaction.f & DERIVED) !== 0;
return false;
} }
/** /**

@ -0,0 +1,13 @@
import { flushSync } from 'svelte';
import { test } from '../../test';
export default test({
html: `<button>toggle (false)</button>`,
test({ assert, target }) {
const btn = target.querySelector('button');
flushSync(() => btn?.click());
assert.htmlEqual(target.innerHTML, `<button>toggle (true)</button><p>bar is true</p>`);
}
});

@ -0,0 +1,12 @@
<script>
let foo = $state(false)
let bar = $derived(foo ? $effect.active() : false);
</script>
<button onclick={() => foo = !foo}>
toggle ({foo})
</button>
{#if bar}
<p>bar is true</p>
{/if}
Loading…
Cancel
Save