--- title: Template syntax --- ### Tags --- A lowercase tag, like `
`, denotes a regular HTML element. A capitalised tag, such as ``, indicates a *component*. ```html
``` ### Attributes --- By default, attributes work exactly like their HTML counterparts. ```html
``` --- As in HTML, values may be unquoted. ```html ``` --- Attribute values can contain JavaScript expressions. ```html page {p} ``` --- Or they can *be* JavaScript expressions. ```html ``` --- An expression might include characters that would cause syntax highlighting to fail in regular HTML, so quoting the value is permitted. The quotes do not affect how the value is parsed: ```html ``` --- When the attribute name and value match (`name={name}`), they can be replaced with `{name}`. ```html ``` --- *Spread attributes* allow many attributes or properties to be passed to an element or component at once. An element or component can have multiple spread attributes, interspersed with regular ones. ```html ``` ### Text expressions ```sv {expression} ``` --- Text can also contain JavaScript expressions: ```html

Hello {name}!

{a} + {b} = {a + b}.

``` ### HTML expressions ```sv {@html expression} ``` --- In a text expression, characters like `<` and `>` are escaped. With HTML expressions, they're not. > Svelte does not sanitize expressions before injecting HTML. If the data comes from an untrusted source, you must sanitize it, or you are exposing your users to an XSS vulnerability. ```html

{post.title}

{@html post.content}
``` ### If blocks ```sv {#if expression}...{/if} ``` ```sv {#if expression}...{:else if expression}...{/if} ``` ```sv {#if expression}...{:else}...{/if} ``` --- Content that is conditionally rendered can be wrapped in an if block. ```html {#if answer === 42}

what was the question?

{/if} ``` --- Additional conditions can be added with `{:else if expression}`, optionally ending in an `{:else}` clause. ```html {#if porridge.temperature > 100}

too hot!

{:else if 80 > porridge.temperature}

too cold!

{:else}

just right!

{/if} ``` ### Each blocks ```sv {#each expression as name}...{/each} ``` ```sv {#each expression as name, index}...{/each} ``` ```sv {#each expression as name, index (key)}...{/each} ``` ```sv {#each expression as name}...{:else}...{/each} ``` --- Iterating over lists of values can be done with an each block. ```html

Shopping list

    {#each items as item}
  • {item.name} x {item.qty}
  • {/each}
``` --- An each block can also specify an *index*, equivalent to the second argument in an `array.map(...)` callback: ```html {#each items as item, i}
  • {i + 1}: {item.name} x {item.qty}
  • {/each} ``` --- If a *key* expression is provided — which must uniquely identify each list item — Svelte will use it to diff the list when data changes, rather than adding or removing items at the end. ```html {#each items as item, i (item.id)}
  • {i + 1}: {item.name} x {item.qty}
  • {/each} ``` --- You can freely use destructuring patterns in each blocks. ```html {#each items as { id, name, qty }, i (id)}
  • {i + 1}: {name} x {qty}
  • {/each} ``` --- An each block can also have an `{:else}` clause, which is rendered if the list is empty. ```html {#each todos as todo}

    {todo.text}

    {:else}

    No tasks today!

    {/each} ``` ### Await blocks ```sv {#await expression}...{:then name}...{:catch name}...{/await} ``` ```sv {#await expression}...{:then name}...{/await} ``` ```sv {#await expression then name}...{/await} ``` --- Await blocks allow you to branch on the three possible states of a Promise — pending, fulfilled or rejected. ```html {#await promise}

    waiting for the promise to resolve...

    {:then value}

    The value is {value}

    {:catch error}

    Something went wrong: {error.message}

    {/await} ``` --- The `catch` block can be omitted if you don't need to render anything when the promise rejects (or no error is possible). ```html {#await promise}

    waiting for the promise to resolve...

    {:then value}

    The value is {value}

    {/await} ``` --- If you don't care about the pending state, you can also omit the initial block. ```html {#await promise then value}

    The value is {value}

    {/await} ``` ### DOM events ```sv on:eventname={handler} ``` ```sv on:eventname|modifiers={handler} ``` --- Use the `on:` directive to listen to DOM events. ```html ``` --- Handlers can be declared inline with no performance penalty. As with attributes, directive values may be quoted for the sake of syntax highlighters. ```html ``` --- Add *modifiers* to DOM events with the `|` character. The following modifiers are available: * `preventDefault` — calls `event.preventDefault()` before running the handler * `stopPropagation` — calls `event.stopPropagation()`, preventing the event reaching the next element * `passive` — improves scrolling performance on touch/wheel events (Svelte will add it automatically where it's safe to do so) * `capture` — fires the handler during the *capture* phase instead of the *bubbling* phase * `once` — remove the handler after the first time it runs Modifiers can be chained together, e.g. `on:click|once|capture={...}`. ```html
    ``` --- If the `on:` directive is used without a value, the component will *forward* the event, meaning that a consumer of the component can listen for it. ```html ``` ### Component events ```sv on:eventname={handler} ``` --- Components can emit events using [createEventDispatcher](docs#createeventdispatcher), or by forwarding DOM events. Listening for component events looks the same as listening for DOM events: ```html ``` ### Element bindings ```sv bind:property={variable} ``` ```sv bind:group={variable} ``` ```sv bind:this={dom_node} ``` --- Data ordinarily flows down, from parent to child. The `bind:` directive allows data to flow the other way, from child to parent. Most bindings are specific to particular elements. The simplest bindings reflect the value of a property, such as `input.value`. ```html ``` --- If the name matches the value, you can use a shorthand. ```html ``` --- Numeric input values are coerced; even though `input.value` is a string as far as the DOM is concerned, Svelte will treat it as a number. If the input is empty or invalid (in the case of `type="number"`), the value is `undefined`. ```html ``` #### Binding related elements --- Inputs that work together can use `bind:group`. ```html ``` #### Binding `` value binding corresponds to the `value` property on the selected ` ``` --- When the value of an `