formalise branch effects

pull/10948/head
Rich Harris 2 years ago
parent fff34c352e
commit dc011bd25f

@ -7,7 +7,7 @@ import {
set_current_effect,
set_current_reaction
} from '../../runtime.js';
import { block, destroy_effect, pause_effect, render_effect } from '../../reactivity/effects.js';
import { block, branch, destroy_effect, pause_effect } from '../../reactivity/effects.js';
import { INERT } from '../../constants.js';
/**
@ -42,7 +42,7 @@ export function await_block(anchor, get_input, pending_fn, then_fn, catch_fn) {
set_current_effect(effect);
set_current_reaction(effect); // TODO do we need both?
set_current_component_context(component_context);
var e = render_effect(() => fn(anchor, value), true);
var e = branch(() => fn(anchor, value));
set_current_component_context(null);
set_current_reaction(null);
set_current_effect(null);
@ -66,7 +66,7 @@ export function await_block(anchor, get_input, pending_fn, then_fn, catch_fn) {
destroy_effect(pending_effect);
}
pending_effect = render_effect(() => pending_fn(anchor), true);
pending_effect = branch(() => pending_fn(anchor));
}
if (then_effect) pause_effect(then_effect);
@ -100,7 +100,7 @@ export function await_block(anchor, get_input, pending_fn, then_fn, catch_fn) {
destroy_effect(then_effect);
}
then_effect = render_effect(() => then_fn(anchor, input), true);
then_effect = branch(() => then_fn(anchor, input));
}
}
});

@ -12,11 +12,11 @@ import { insert, remove } from '../reconciler.js';
import { untrack } from '../../runtime.js';
import {
block,
branch,
destroy_effect,
effect,
pause_effect,
pause_effects,
render_effect,
resume_effect
} from '../../reactivity/effects.js';
import { source, mutable_source, set } from '../../reactivity/sources.js';
@ -153,7 +153,7 @@ function each(anchor, flags, get_collection, get_key, render_fn, fallback_fn, re
if (fallback) {
resume_effect(fallback);
} else {
fallback = render_effect(() => {
fallback = branch(() => {
var dom = fallback_fn(anchor);
return () => {
@ -161,7 +161,7 @@ function each(anchor, flags, get_collection, get_key, render_fn, fallback_fn, re
remove(dom);
}
};
}, true);
});
}
} else if (fallback !== null) {
pause_effect(fallback, () => {
@ -579,7 +579,7 @@ function create_item(anchor, value, key, index, render_fn, flags) {
try {
current_each_item = item;
item.e = render_effect(() => {
item.e = branch(() => {
var dom = render_fn(anchor, item.v, item.i);
return () => {
@ -587,7 +587,7 @@ function create_item(anchor, value, key, index, render_fn, flags) {
remove(dom);
}
};
}, true);
});
return item;
} finally {

@ -3,9 +3,9 @@ import { hydrate_nodes, hydrating, set_hydrating } from '../hydration.js';
import { remove } from '../reconciler.js';
import {
block,
branch,
destroy_effect,
pause_effect,
render_effect,
resume_effect
} from '../../reactivity/effects.js';
@ -62,7 +62,7 @@ export function if_block(
if (consequent_effect) {
resume_effect(consequent_effect);
} else {
consequent_effect = render_effect(() => consequent_fn(anchor), true);
consequent_effect = branch(() => consequent_fn(anchor));
}
if (alternate_effect) {
@ -74,7 +74,7 @@ export function if_block(
if (alternate_effect) {
resume_effect(alternate_effect);
} else if (alternate_fn) {
alternate_effect = render_effect(() => alternate_fn(anchor), true);
alternate_effect = branch(() => alternate_fn(anchor));
}
if (consequent_effect) {

@ -1,6 +1,6 @@
import { UNINITIALIZED } from '../../constants.js';
import { remove } from '../reconciler.js';
import { block, pause_effect, render_effect } from '../../reactivity/effects.js';
import { block, branch, pause_effect } from '../../reactivity/effects.js';
import { safe_not_equal } from '../../reactivity/equality.js';
/**
@ -33,7 +33,7 @@ export function key_block(anchor, get_key, render_fn) {
});
}
effect = render_effect(() => {
effect = branch(() => {
const dom = render_fn(anchor);
return () => {
@ -41,7 +41,7 @@ export function key_block(anchor, get_key, render_fn) {
remove(dom);
}
};
}, true);
});
effects.add(effect);
}

@ -1,4 +1,4 @@
import { block, pause_effect, render_effect } from '../../reactivity/effects.js';
import { block, branch, pause_effect, render_effect } from '../../reactivity/effects.js';
import { remove } from '../reconciler.js';
import { current_effect } from '../../runtime.js';
@ -37,7 +37,7 @@ export function component(anchor, get_component, render_fn) {
}
if (component) {
effect = render_effect(() => {
effect = branch(() => {
render_fn(component);
// `render_fn` doesn't return anything, and we can't reference `effect`
@ -47,7 +47,7 @@ export function component(anchor, get_component, render_fn) {
return () => {
if (dom !== null) remove(dom);
};
}, true);
});
effects.add(effect);
}

@ -3,9 +3,9 @@ import { hydrate_anchor, hydrate_nodes, hydrating } from '../hydration.js';
import { empty } from '../operations.js';
import {
block,
branch,
destroy_effect,
pause_effect,
render_effect,
resume_effect
} from '../../reactivity/effects.js';
import { remove } from '../reconciler.js';
@ -101,7 +101,7 @@ export function element(anchor, get_tag, is_svg, render_fn) {
}
if (next_tag && next_tag !== current_tag) {
effect = render_effect(() => {
effect = branch(() => {
const prev_element = element;
element = hydrating
? /** @type {Element} */ (hydrate_nodes[0])
@ -131,7 +131,7 @@ export function element(anchor, get_tag, is_svg, render_fn) {
swap_block_dom(parent_effect, prev_element, element);
prev_element.remove();
}
}, true);
});
}
tag = next_tag;

@ -1,6 +1,6 @@
import { hydrate_anchor, hydrate_nodes, hydrating, set_hydrate_nodes } from '../hydration.js';
import { empty } from '../operations.js';
import { block, render_effect } from '../../reactivity/effects.js';
import { block } from '../../reactivity/effects.js';
import { remove } from '../reconciler.js';
/**

@ -222,6 +222,11 @@ export function block(fn) {
return create_effect(BLOCK_EFFECT, fn, true);
}
/** @param {(() => void)} fn */
export function branch(fn) {
return create_effect(EFFECT | RENDER_EFFECT | MANAGED, fn, true);
}
/**
* @param {import('#client').Effect} effect
* @returns {void}

Loading…
Cancel
Save