Tagspermalink
A lowercase tag, like <div>
, denotes a regular HTML element. A capitalised tag, such as <Widget>
or <Namespace.Widget>
, indicates a component.
<script>
import Widget from './Widget.svelte';
</script>
<div>
<Widget />
</div>
Attributes and propspermalink
By default, attributes work exactly like their HTML counterparts.
<div class="foo">
<button disabled>can't touch this</button>
</div>
As in HTML, values may be unquoted.
<input type=checkbox />
Attribute values can contain JavaScript expressions.
<a href="page/{p}">page {p}</a>
Or they can be JavaScript expressions.
<button disabled={!clickable}>...</button>
Boolean attributes are included on the element if their value is truthy and excluded if it's falsy.
All other attributes are included unless their value is nullish (null
or undefined
).
<input required={false} placeholder="This input field is not required" />
<div title={null}>This div has no title attribute</div>
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:
<button disabled="{number !== 42}">...</button>
When the attribute name and value match (name={name}
), they can be replaced with {name}
.
<button {disabled}>...</button>
<!-- equivalent to
<button disabled={disabled}>...</button>
-->
By convention, values passed to components are referred to as properties or props rather than attributes, which are a feature of the DOM.
As with elements, name={name}
can be replaced with the {name}
shorthand.
<Widget foo={bar} answer={42} text="hello" />
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.
<Widget {...things} />
$$props
references all props that are passed to a component, including ones that are not declared with export
. Using $$props
will not perform as well as references to a specific prop because changes to any prop will cause Svelte to recheck all usages of $$props
. But it can be useful in some cases – for example, when you don't know at compile time what props might be passed to a component.
<Widget {...$$props} />
$$restProps
contains only the props which are not declared with export
. It can be used to pass down other unknown attributes to an element in a component. It shares the same performance characteristics compared to specific property access as $$props
.
<input {...$$restProps} />
The
value
attribute of aninput
element or its childrenoption
elements must not be set with spread attributes when usingbind:group
orbind:checked
. Svelte needs to be able to see the element'svalue
directly in the markup in these cases so that it can link it to the bound variable.
Sometimes, the attribute order matters as Svelte sets attributes sequentially in JavaScript. For example,
<input type="range" min="0" max="1" value={0.5} step="0.1"/>
, Svelte will attempt to set the value to1
(rounding up from 0.5 as the step by default is 1), and then set the step to0.1
. To fix this, change it to<input type="range" min="0" max="1" step="0.1" value={0.5}/>
.
Another example is
<img src="..." loading="lazy" />
. Svelte will set the imgsrc
before making the img elementloading="lazy"
, which is probably too late. Change this to<img loading="lazy" src="...">
to make the image lazily loaded.
Text expressionspermalink
A JavaScript expression can be included as text by surrounding it with curly braces.
{expression}
Curly braces can be included in a Svelte template by using their HTML entity strings: {
, {
, or {
for {
and }
, }
, or }
for }
.
If you're using a regular expression (
RegExp
) literal notation, you'll need to wrap it in parentheses.
<h1>Hello {name}!</h1>
<p>{a} + {b} = {a + b}.</p>
<div>{(/^[A-Za-z ]+$/).test(value) ? x : y}</div>
Commentspermalink
You can use HTML comments inside components.
<!-- this is a comment! --><h1>Hello world</h1>
Comments beginning with svelte-ignore
disable warnings for the next block of markup. Usually, these are accessibility warnings; make sure that you're disabling them for a good reason.
<!-- svelte-ignore a11y-autofocus -->
<input bind:value={name} autofocus />