Kurs Svelte i SvelteKit · Moduł 8: Stores

Studnia Mimir - Stores

2 min czytania ·
W tej lekcji3

Witaj przy Studni Mimir! Odin oddał oko za możliwość picia z tej studni mądrości. Stores w Svelte to właśnie takie źródło - wspólna mądrość dostępna dla wszystkich komponentów.

Czym są Stores?

Stores to reaktywne kontenery na dane, dostępne globalnie:

// stores.js
import { writable, readable, derived } from 'svelte/store';

// Writable - można czytać i pisać
export const gold = writable(0);

// Readable - tylko do odczytu
export const time = readable(new Date(), set => {
  const interval = setInterval(() => set(new Date()), 1000);
  return () => clearInterval(interval);
});

// Derived - obliczony z innych stores
export const doubleGold = derived(gold, $gold => $gold * 2);

Stores działają w Svelte 5 tak jak wcześniej i znajdziesz je w wielu bibliotekach. Do stanu współdzielonego w nowym kodzie Svelte 5 poleca też runy w plikach .svelte.js - porównasz oba sposoby w lekcji 8_4.

Writable Store

<script>
  import { gold } from './stores.js';

  // Subskrypcja z $
  // $gold automatycznie subskrybuje i odsubskrybuje
</script>

<p>Złoto: {$gold}</p>
<button onclick={() => $gold += 10}>+10 złota</button>
<button onclick={() => gold.set(0)}>Reset</button>
<button onclick={() => gold.update(n => n * 2)}>x2</button>

Metody writable

import { writable } from 'svelte/store';

const count = writable(0);

// Pobierz aktualną wartość (jednorazowo)
import { get } from 'svelte/store';
console.log(get(count)); // 0

// Ustaw wartość
count.set(10);

// Aktualizuj na podstawie poprzedniej
count.update(n => n + 1);

// Subskrybuj zmiany
const unsubscribe = count.subscribe(value => {
  console.log('Nowa wartość:', value);
});

// Odsubskrybuj
unsubscribe();

Studnia Mimir dzieli mądrość - Stores dzielą dane!

Kod do tej lekcji: App.svelte
<script>
  // Studnia Mimir - Mądrość współdzielona między komponentami
  // writable, readable, derived stores
  import { count, doubled, reset } from './stores.js';
  import Counter from './Counter.svelte';
  import Display from './Display.svelte';
</script>

<main class="mimir">
  <h1>Studnia Mimir - Stores</h1>
  <p class="subtitle">Współdzielony stan między komponentami</p>

  <section>
    <h2>writable store</h2>
    <p>Wartość w App: <strong>{$count}</strong></p>
    <p>derived (doubled): <strong>{$doubled}</strong></p>
    <button onclick={reset}>Reset</button>
  </section>

  <div class="components">
    <Counter />
    <Display />
  </div>
</main>

<style>
  .mimir {
    font-family: 'Georgia', serif;
    max-width: 600px;
    margin: 0 auto;
    padding: 2rem;
    background: linear-gradient(135deg, #0a1628 0%, #1a2d4e 100%);
    color: #b8d4f7;
    min-height: 100vh;
  }

  h1 {
    color: #4a90d9;
    text-align: center;
  }

  .subtitle {
    text-align: center;
    color: #6a8ab9;
  }

  section {
    background: rgba(74, 144, 217, 0.1);
    border: 1px solid #4a90d9;
    border-radius: 8px;
    padding: 1rem;
    margin: 1rem 0;
  }

  h2 {
    color: #4a90d9;
    font-size: 1rem;
    margin-top: 0;
  }

  strong {
    color: #7cb3f0;
    font-size: 1.25rem;
  }

  button {
    padding: 0.5rem 1rem;
    background: #1e3a5f;
    color: #b8d4f7;
    border: 1px solid #4a90d9;
    border-radius: 4px;
    cursor: pointer;
  }

  .components {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 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. 1. Jakie są trzy podstawowe typy stores w Svelte?

Zadania praktyczne w grze

  • Edytor kodu

    Uzupełnij kod, aby wyświetlić wartość store gold

Przydatne artykuły