Svelte
Basics
This works when var names and attribute names are the same
<img src={src}>
<img {src}
Styles are scoped to the component
Strings that contain html:
<script>
let string = `this string contains some <strong>HTML!!!</strong>`;
</script>
<p>{@html string}</p>
<button on:click={increment}>
Clicked {count}
{count === 1 ? 'time' : 'times'}</button>
<script>
function increment() {
+= 1;
count
}</script>
Rendering Strings as HTML
<p>{@html string}</p>
Reactive Values
let count = 0;
// every time count changes, doubled recomputes
: doubled = count * 2;
$
// it can also be functions, or in front of if statements
// This gets logged every time the value changes
: console.log(`the count is ${count}`);
$
// or
: {
$console.log(`the count is ${count}`);
console.log(`this will also be logged whenever count changes`);
}
Reactivity is triggered by assignment. So methods like `numbers.push()` don't cause updates. But this does:
= [...numbers, newNumber] numbes
Logic
{#if count > 10}<p>{count} is greater than 10</p>
< 5}
{:else if count <p>{count} is less than 5</p>
{:else}<p>{count} is between 0 and 10</p>
{/if}
{#each colors as color, i}<button
aria-current={selected === color}
aria-label={color}
style="background: {color}"
on:click={() => selected = color}
</button>
>{i + 1}
{/each}
Specifying a key for the iteration. Update when thing.id changes
{#each things as thing (thing.id)}<Thing name={thing.name}/>
{/each}
Async
{#await promise then number}<p>The number is {number}</p>
{/await}
Props
- Pass data into a component or to the children of a component
Nested.svelte
<script>
export let answer = 'default'
</script>
<script>
import Nested from './Nested.svelte';
</script>
<Nested answer={42} />
<Nested /> defaults to 'default'
Passing values into props:
PackageInfo.svelte
<script>
export let name;
export let version;
export let speed;
export let website;
</script>
<script>
import PackageInfo from './PackageInfo.svelte';
const pkg = {
name: 'svelte',
speed: 'blazing',
version: 4,
website: 'https://svelte.dev'
};
</script>
<PackageInfo {...pkg} />
Basically use props for repeated frontend components that optionally have variable inputs
Handling Events
<!-- modifier - only run it once -->
<div on:pointermove|once={handleMove}>
<div
on:pointermove={(e) => {
m = { x: e.clientX, y: e.clientY };
}}
>
<script>
import { getRandomNumber } from './utils.js';
let promise = getRandomNumber();
function handleClick() {
promise = getRandomNumber();
}
</script>
{#await promise}
<p>...waiting</p>
{:then number}
<p>The number is {number}</p>
{:catch error}
<p style="color: red">{error.message}</p>
{/await}
Event forwarding
- The intermediate components (deeply nested components) must forward the event to the outer components
Components
<script>
import Nested from './Nested.svelte'
</script>
<Nested />