基本的なストアの利用方法
基本的なストアの利用法を、図2のサンプルで説明します。カウンターの値が格納されたストアをもとに、CountDisplayコンポーネントがカウンターの値を表示、CountOperatorコンポーネントが変更します。
ストアの実装はリスト1の通りです。(1)でカウンターの値に対応する変数countを宣言して、0で初期化します。「writable」記述は、このストアが書き込み可能であることを表します。
import { writable } from 'svelte/store'; // 書き込み可能なストア ...(1) export const count = writable(0);
countストアを参照してカウンター値を表示するコンポーネントの<script>部はリスト2の通りです。
<script lang="ts"> import { count } from '$lib/store'; import { onMount } from 'svelte'; // 画面に表示するカウンター ...(1) let countValue: number; onMount(() => { // マウント時、countの値を常に取得するようサブスクライブする処理 ...(2) // サブスクライブを解除(アンサブスクライブ)する関数が戻る const unsubscribe = count.subscribe(value => { countValue = value; }); return () => { // アンマウント時、アンサブスクライブする処理 ...(3) unsubscribe(); }; }); </script>
画面に実際に表示されるカウンターは(1)のcountValue変数です。onMount関数内では、まずコンポーネントのマウント(表示)時に(2)のcount.subscribeメソッドでcountストアをサブスクライブ(購読)して、countValueにカウンターの値を常に反映するようにします。
また、countストアをアンサブスクライブ(購読解除)する関数がcount.suscribeメソッドの戻り値として返却されるので、コンポーネントのアンマウント(非表示)時に(3)の通りunsubscribe関数を実行してアンサブスクライブするようにします。
一方、countストアを変更するコンポーネントの<script>部はリスト3の通りです。
<script> import { count } from '$lib/store'; // カウントアップ ...(1) const increment = () => { count.update(n => n + 1); }; // リセット ...(2) const reset = () => { count.set(0); }; </script>
カウントアップボタンのクリック時に実行される(1)のincrement関数では、countストアのupdateメソッドで、ストアの値を1加算します。updateメソッドには、ストアの値を変更する関数を渡します(「n => n + 1」は、引数に1を加算して返却する関数を表します)。リセットボタンのクリック時に実行される(2)のreset関数では、countストアのsetメソッドで、ストアの値を0に設定します。