Может ли компонент Svelte получить доступ к элементу DOM для содержимого его слота?

#javascript #components #svelte

Вопрос:

Допустим, у меня есть стройный код, такой как:

 <!-- Widget.svelte -->
<div>
    <slot>No video was provided</slot>
</div>

<!-- App.svelte -->
<Widget>
    <video id="example">
    </video>
</Widget>
 

В Widget.svelte есть ли хороший способ для меня получить представление об элементе video DOM из слота, предоставленного родителями? (Конечно, я мог бы передать реквизит, например videoElementId="example" , из App.svelte, а затем создать document.getElementById(videoElementId) внутренний виджет.svelte-но это будет работать вокруг API Svelte, а не внутри него.)

Ответ №1:

Я не знаю встроенного способа размещения элементов в слоте, но вы можете привязаться к элементу контейнера и запросить его дочерние элементы:

 <!-- App.svelte -->
<script>    
    import Slotted from './Slotted.svelte';
</script>

<Slotted>
    <p>
        I'm a paragraph
    </p>
</Slotted>

<!-- Slotted.svelte -->
<script>
    import { onMount} from 'svelte';    
    let container;
    let childContent;
    
    onMount(() => {
        let firstChild = container.children[0];
        childContent = firstChild.textContent;
    });
</script>

<p>
    Child content: {childContent}
</p>
<div bind:this={container}>
    <slot></slot>
</div>