У меня есть статический HTML-файл, и я хочу дополнить его динамическими компонентами Svelte:
<ul id="list">
<li>first</li>
<!-- dynamic list items should be added in between static ones -->
<li>last</li>
</ul>
(Это упрощенный пример; «первый» и «последний» элементы более сложные, повторяющиесягенерировать их в Svelte не вариант.)
import List from "./List.svelte";
new List({
target: document.querySelector("#list"),
props: {
items: ["foo", "bar"]
}
});
<script>
let items;
</script>
{#each items as item}
<li>{item}</li>
{/each}
Это добавляет динамические элементы в конец списка. Есть ли идиоматический, декларативный способ вставить их в середину вместо этого?
Единственное решение, о котором я могу думать, - это громоздкие, не декларативные манипуляции с DOM:
<script>
import { onMount } from "svelte";
let items;
onMount(() => {
let container = ref.parentNode;
container.removeChild(ref);
// manually change order
let last = container.querySelectorAll("li")[1];
container.appendChild(last);
})
</script>
<span bind:this={ref} hidden />
{#each items as item}
<li>{item}</li>
{/each}
(ядаже не уверен, что это верно, потому что span
элементы не допускаются как прямые ul
потомки, плюс ручное отбрасывание ref
может сбить с толку Svelte?)