Special Elements

Svelte 有提供一些特別元素,用來幫助你更好的建置前端應用程式。

<svelte:self>

一個元件是無法在自己的模板中引用自己的,但是你可以使用 <svelte:self> 來代替。

常見的例子是顯示如樹狀結構般的資料夾與檔案。 因為資料夾底下可能有另外一個資料夾,這代表資料夾的元件,底下可能還需要一個資料夾元件。

我們在元件中無法引入自身,但可以使用 <svelte:self>

<!-- Folder.svelte -->

{#if file.files}
    <!-- 使用 svelte:self 代表自己  -->
    <svelte:self {...file} />
{:else}
    <File {...file} />
{/if}

<svelte:component>

<svelte:component> 元素可以讓你在 runtime 時,動態的載入元件。

<script>
    import Foo from './Foo.svelte';
    import Bar from './Bar.svelte';

    let component = Foo;
</script>

<!-- 這邊會顯示 Foo 元件 -->
<svelte:component this={component} />

<svelte:element>

<svelte:component> 類似, <svelte:element> 元素可以讓你在 runtime 時,動態的載入 HTML 元素。

<script>
    let element = 'div';
</script>

<!-- 這邊會顯示 div 元素 -->
<svelte:element this={element}>
    Hello!
</svelte:element>

<svelte:window>

<svelte:window> 可以讓你將事件監聽器加到 window 物件上。

<script>
    function handleKeydown(event) {
        console.log(event.key);
    }
</script>

<svelte:window on:keydown={handleKeydown} />

<svelte:window> Bindings

<svelte:window> 也可以使用 bind 來綁定某些屬性,例如 scrollY

<script>
    let y = 0;
</script>

<!-- 使用 bind:scrollY 綁定滾動條的值 -->
<svelte:window bind:scrollY={y} />

<svelte:body>

<svelte:body> 可以讓你將事件監聽器加到 document.body 物件上。

<svelte:body
    on:mouseenter={() => showCat = true}
    on:mouseleave={() => showCat = false}
/>

<svelte:document>

<svelte:document> 可以讓你監聽 document 物件的事件,例如 selectionchange

<svelte:document on:selectionchange={handleSelectionChange} />

<svelte:head>

<svelte:head> 可以讓你在 <head> 中插入新的元素。

<svelte:head>
    <link rel="stylesheet" href="/stylesheets/{selected}.css" />
</svelte:head>

[!NOTE]

在伺服器端渲染 (SSR) 模式下,<svelte:head> 的內容將與 HTML 的其餘部分分開傳回。

<svelte:options>

<svelte:options> 可以讓你調整 Svelte 編譯時的設定。

你可以設定一個元件的 immutable 屬性,當 immutable 設定為 true 時, 如果元件內部的值更新,他就會將元件刪除並重新建立元件,而非單純更新元件內的元素:

<!-- 通常會放在元件的最上面 -->
<svelte:options immutable />

<svelte:fragment>

<svelte:fragment> 元素可讓你將內容放置在 slot 中,但不需要將其包裝在容器 DOM 元素中。

<!-- 一般的 slot 用法 -->
<!-- 會連 <div slot="box"> 都一起被放入元件的 <slot name="box"> 中 -->
<div slot="box">
    <h2>Box</h2>
    <span>This is a box</span>
</div>

<!-- 使用 <svelte:fragment> -->
<!-- 只會將 <h2> 與 <span> 放入元件的 <slot name="box"> 中 -->
<svelte:fragment slot="box">
    <h2>Box</h2>
    <span>This is a box</span>
</svelte:fragment>

This site uses Just the Docs, a documentation theme for Jekyll.