|
1 | 1 | import { derived } from '../../reactivity/deriveds.js'; |
2 | 2 | import { render_effect } from '../../reactivity/effects.js'; |
3 | 3 | import { current_effect, get } from '../../runtime.js'; |
| 4 | +import { is_array } from '../../utils.js'; |
4 | 5 | import { hydrate_nodes, hydrating } from '../hydration.js'; |
5 | 6 | import { create_fragment_from_html, remove } from '../reconciler.js'; |
6 | 7 | import { push_template_node } from '../template.js'; |
7 | 8 |
|
| 9 | +/** |
| 10 | + * @param {import('#client').Effect} effect |
| 11 | + * @param {(Element | Comment | Text)[]} to_remove |
| 12 | + * @returns {void} |
| 13 | + */ |
| 14 | +function remove_from_parent_effect(effect, to_remove) { |
| 15 | + const dom = effect.dom; |
| 16 | + |
| 17 | + if (is_array(dom)) { |
| 18 | + for (let i = dom.length - 1; i >= 0; i--) { |
| 19 | + if (to_remove.includes(dom[i])) { |
| 20 | + dom.splice(i, 1); |
| 21 | + break; |
| 22 | + } |
| 23 | + } |
| 24 | + } else if (dom !== null && to_remove.includes(dom)) { |
| 25 | + effect.dom = null; |
| 26 | + } |
| 27 | +} |
| 28 | + |
8 | 29 | /** |
9 | 30 | * @param {Element | Text | Comment} anchor |
10 | 31 | * @param {() => string} get_value |
11 | 32 | * @param {boolean} svg |
12 | 33 | * @returns {void} |
13 | 34 | */ |
14 | 35 | export function html(anchor, get_value, svg) { |
15 | | - var effect = anchor.parentNode !== current_effect?.dom ? current_effect : null; |
| 36 | + const parent_effect = anchor.parentNode !== current_effect?.dom ? current_effect : null; |
16 | 37 | let value = derived(get_value); |
17 | 38 |
|
18 | 39 | render_effect(() => { |
19 | | - var dom = html_to_dom(anchor, effect, get(value), svg); |
20 | | - effect = null; |
| 40 | + var dom = html_to_dom(anchor, parent_effect, get(value), svg); |
21 | 41 |
|
22 | 42 | if (dom) { |
23 | | - return () => remove(dom); |
| 43 | + return () => { |
| 44 | + if (parent_effect !== null) { |
| 45 | + remove_from_parent_effect(parent_effect, is_array(dom) ? dom : [dom]); |
| 46 | + } |
| 47 | + remove(dom); |
| 48 | + }; |
24 | 49 | } |
25 | 50 | }); |
26 | 51 | } |
|
0 commit comments