create correct parent-child relationship between if block and its branches

pull/10794/head
Rich Harris 2 years ago
parent 82275adea3
commit 0a7615fe1b

@ -127,14 +127,13 @@ export function if_block(anchor_node, condition_fn, consequent_fn, alternate_fn)
has_mounted = true;
}
},
block,
false
);
// Managed effect
consequent_effect = render_effect(
(/** @type {any} */ _, /** @type {import('#client').Effect | null} */ consequent_effect) => {
// create these here so they have the correct parent/child relationship
consequent_effect ??= render_effect(
(
/** @type {any} */ _,
/** @type {import('#client').Effect | null} */ consequent_effect
) => {
const result = block.v;
if (!result && consequent_dom !== null) {
@ -159,8 +158,7 @@ export function if_block(anchor_node, condition_fn, consequent_fn, alternate_fn)
);
block.ce = consequent_effect;
// Managed effect
alternate_effect = render_effect(
alternate_effect ??= render_effect(
(/** @type {any} */ _, /** @type {import('#client').Effect | null} */ alternate_effect) => {
const result = block.v;
@ -188,6 +186,10 @@ export function if_block(anchor_node, condition_fn, consequent_fn, alternate_fn)
true
);
block.ae = alternate_effect;
},
block,
false
);
if_effect.ondestroy = () => {
if (consequent_dom !== null) {

@ -786,25 +786,11 @@ export function mark_subtree_inert(signal, inert, visited_blocks = new Set()) {
if (!inert && (flags & CLEAN) === 0) {
schedule_effect(signal, false);
}
// Nested if block effects
const block = signal.block;
if (block !== null && !visited_blocks.has(block)) {
visited_blocks.add(block);
const type = block.t;
if (type === IF_BLOCK) {
const condition_effect = block.e;
if (condition_effect !== null && block !== current_block) {
mark_subtree_inert(condition_effect, inert, visited_blocks);
}
const consequent_effect = block.ce;
if (consequent_effect !== null && block.v) {
mark_subtree_inert(consequent_effect, inert, visited_blocks);
}
const alternate_effect = block.ae;
if (alternate_effect !== null && !block.v) {
mark_subtree_inert(alternate_effect, inert, visited_blocks);
}
} else if (type === EACH_BLOCK) {
if (block.t === EACH_BLOCK) {
const items = block.v;
for (let { e: each_item_effect } of items) {
if (each_item_effect !== null) {

Loading…
Cancel
Save