Я использую внешний код, который возвращает элемент HTML, и было бы неплохо встроить его, не управляя загрузкой и всем остальным через JavaScript (например, appendChild
/ removeChild
). Прямо сейчас я использую {@html element.outerHTML}
, но это кажется неэлегантным для обхода HTML-строки:
<script>
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function someCall() {
await sleep(1000);
const p = document.createElement("p");
p.innerText = "hello!";
console.info(p);
return p;
}
let data = someCall();
</script>
<div>
{#await data}
<p>Loading data...</p>
{:then result}
{@html result.outerHTML}
{/await}
</div>
То, что я ищу, может быть что-то вроде
<div>
{#await data}
<p>Loading data...</p>
{:then result}
{result}
{/await}
</div>
но это не сработает (так как он помещает элемент в строку).
Я думаю, ты сможешь сделать это вот так.
<script>
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function someCall() {
await sleep(1000);
return `<p>hello</p>`;
}
let data = someCall();
</script>
<main>
<div>
{#await data}
<p>Loading data...</p>
{:then result}
{@html result}
{/await}
</div>
</main>
https://codesandbox.io/s/blissful-sea-mfcx5?file=/App.svelte:0-336
Вы можете использовать bind: this для добавления HTML
<script>
import { onMount } from 'svelte';
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
let elem;
onMount(async () => {
await sleep(1000);
const p = document.createElement("p");
p.innerText = "hello!";
elem.appendChild(p)
});
</script>
<div bind:this = {elem}>
</div>