У меня есть статический 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?)
items: ["foo", ...document.querySelectorAll("#list li"), "bar"]
приводит к отображению[object HTMLLIElement]
, что разочаровывает. (Я делаю это, потому что верю в прогрессивное улучшение, используя Svelte для расширения существующей архитектуры, а не подчиняя ее с помощью Svelte, захватившего контроль над всей страницей.) - person AnC   schedule 22.10.2019