move <svelte:component> code

blockless
Rich Harris 2 years ago
parent 7b9fb6053e
commit 529f9872bd

@ -0,0 +1,35 @@
import { hydrate_block_anchor } from '../../hydration.js';
import { pause_effect, render_effect } from '../../reactivity/computations.js';
/**
* @template {Record<string, any>} P
* @template {(node: Node, props: P) => void} C
* @param {Comment} anchor_node
* @param {() => C} component_fn
* @param {(component: C) => void} render_fn
* @returns {void}
*/
export function component(anchor_node, component_fn, render_fn) {
hydrate_block_anchor(anchor_node);
/** @type {C | null} */
let Component = null;
/** @type {import('../../types.js').ComputationSignal | null} */
let effect = null;
render_effect(() => {
if (Component === (Component = component_fn() ?? null)) return;
if (effect) {
const e = effect;
pause_effect(effect, () => {
if (e === effect) effect = null;
});
}
if (Component) {
effect = render_effect(() => render_fn(/** @type {C} */ (Component)), {}, true);
}
});
}

@ -1522,39 +1522,6 @@ export function head(fn) {
} }
} }
/**
* @template {Record<string, any>} P
* @template {(node: Node, props: P) => void} C
* @param {Comment} anchor_node
* @param {() => C} component_fn
* @param {(component: C) => void} render_fn
* @returns {void}
*/
export function component(anchor_node, component_fn, render_fn) {
hydrate_block_anchor(anchor_node);
/** @type {C | null} */
let Component = null;
/** @type {import('./types.js').ComputationSignal | null} */
let effect = null;
render_effect(() => {
if (Component === (Component = component_fn() ?? null)) return;
if (effect) {
const e = effect;
pause_effect(effect, () => {
if (e === effect) effect = null;
});
}
if (Component) {
effect = render_effect(() => render_fn(/** @type {C} */ (Component)), {}, true);
}
});
}
/** /**
* @param {Element | Text | Comment} anchor * @param {Element | Text | Comment} anchor
* @param {boolean} is_html * @param {boolean} is_html

@ -24,6 +24,7 @@ export * from './client/dev/ownership.js';
export { await_block as await } from './client/dom/blocks/await.js'; export { await_block as await } from './client/dom/blocks/await.js';
export { if_block as if } from './client/dom/blocks/if.js'; export { if_block as if } from './client/dom/blocks/if.js';
export { key_block as key } from './client/dom/blocks/key.js'; export { key_block as key } from './client/dom/blocks/key.js';
export { component } from './client/dom/blocks/svelte-component.js';
export { element } from './client/dom/blocks/svelte-element.js'; export { element } from './client/dom/blocks/svelte-element.js';
export * from './client/dom/blocks/each.js'; export * from './client/dom/blocks/each.js';
export * from './client/reactivity/computations.js'; export * from './client/reactivity/computations.js';

Loading…
Cancel
Save