Kurs Svelte i SvelteKit · Moduł 5: Wiązania
bind:this - Referencje DOM
W tej lekcji5
bind:this daje dostęp do elementu DOM - jak chwycenie mostu Bifröst!
Podstawowe użycie
<script>
let inputElement;
function focusInput() {
inputElement.focus();
}
</script>
<input bind:this={inputElement} placeholder="Kliknij przycisk..." />
<button onclick={focusInput}>Fokus na input</button>Canvas
<script>
import { onMount } from 'svelte';
let canvas;
onMount(() => {
const ctx = canvas.getContext('2d');
// Rysuj runę
ctx.fillStyle = 'gold';
ctx.font = '48px serif';
ctx.fillText('ᚱ', 50, 60);
});
</script>
<canvas bind:this={canvas} width="200" height="100"></canvas>Audio i Video
<script>
let audio;
let isPlaying = $state(false);
let currentTime = $state(0);
let duration = $state(0);
function togglePlay() {
if (isPlaying) {
audio.pause();
} else {
audio.play();
}
isPlaying = !isPlaying;
}
</script>
<audio
bind:this={audio}
bind:currentTime
bind:duration
src="/horn.mp3"
></audio>
<button onclick={togglePlay}>
{isPlaying ? 'Pauza' : 'Graj'}
</button>
<p>Czas: {Math.floor(currentTime)} / {Math.floor(duration)}</p>bind:this z komponentami
<script>
import WarriorPanel from './WarriorPanel.svelte';
let panel;
function openPanel() {
panel.open(); // Wywołaj metodę komponentu
}
</script>
<WarriorPanel bind:this={panel} />
<button onclick={openPanel}>Otwórz panel</button><!-- WarriorPanel.svelte -->
<script>
let isOpen = $state(false);
export function open() {
isOpen = true;
}
export function close() {
isOpen = false;
}
</script>
{#if isOpen}
<div class="panel">
Panel wojownika
<button onclick={close}>Zamknij</button>
</div>
{/if}bind:value z własnym komponentem ($bindable)
bind: działa też z Twoimi komponentami, ale tylko na props oznaczonych przez $bindable() (poznałeś je w Asgardzie, w module 4). Komponent deklaruje taki prop, a rodzic wiąże go przez bind:value:
<!-- Slider.svelte -->
<script>
let { value = $bindable(50), label = '' } = $props();
</script>
<label>
{label}: {value}
<input type="range" min="0" max="100" bind:value />
</label><!-- App.svelte -->
<script>
import Slider from './Slider.svelte';
let health = $state(100);
</script>
<Slider bind:value={health} label="Zdrowie" />
<p>Zdrowie wojownika: {health}</p>Przesunięcie suwaka zmienia health w rodzicu. Bez $bindable() takie bind:value kończy się błędem - prop płynie wtedy tylko od rodzica do dziecka. W edytorze poniżej tak samo działają Slider i TextInput.
Kod do tej lekcji: App.svelte
<script>
// Svelte 5: $bindable() - bindable props
import Slider from './Slider.svelte';
import TextInput from './TextInput.svelte';
let health = $state(100);
let strength = $state(75);
let warriorName = $state('Ragnar');
</script>
<main class="stats-panel">
<h1>Stats Panel</h1>
<p class="subtitle">Svelte 5: $bindable() props</p>
<section>
<h2>Warrior name</h2>
<TextInput bind:value={warriorName} label="Name" />
<p>Hello, <strong>{warriorName}</strong>!</p>
</section>
<section>
<h2>Stats</h2>
<Slider
bind:value={health}
label="Health"
color="#ff4444"
/>
<Slider
bind:value={strength}
label="Strength"
color="#ffd700"
/>
</section>
<div class="preview">
<h2>{warriorName}</h2>
<div class="stat">
<span>{health}</span>
<span>{strength}</span>
</div>
<p class="total">Total power: {health + strength}</p>
</div>
</main>
<style>
.stats-panel {
font-family: 'Georgia', serif;
max-width: 500px;
margin: 0 auto;
padding: 2rem;
background: #1a0f0a;
color: #e8d5b7;
min-height: 100vh;
}
h1 {
color: #d4af37;
text-align: center;
}
.subtitle {
text-align: center;
color: #8b7355;
}
section {
background: rgba(212, 175, 55, 0.1);
border: 1px solid #d4af37;
border-radius: 8px;
padding: 1rem;
margin: 1rem 0;
}
h2 {
color: #d4af37;
font-size: 1rem;
margin-top: 0;
}
strong {
color: #ffd700;
}
.preview {
background: rgba(255, 215, 0, 0.1);
border: 2px solid #ffd700;
border-radius: 8px;
padding: 1.5rem;
text-align: center;
}
.preview h2 {
color: #ffd700;
font-size: 1.5rem;
margin: 0;
}
.stat {
display: flex;
justify-content: center;
gap: 2rem;
margin: 1rem 0;
font-size: 1.25rem;
}
.total {
color: #b19cd9;
font-size: 1rem;
}
</style>Hasła z dokumentacji w tej lekcji
Widzisz błąd w tej lekcji?
Sprawdź się
Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.
1. Do czego służy bind:this?
Zadania praktyczne w grze
- Edytor kodu
Uzupełnij kod, aby uzyskać referencję do canvas - onMount narysuje na nim runę