こんにちは!
今日も引き続き、Svelteの学習をしていきます。
前回、$state() なんぞこれ。みたいな話があったんですが、
今回はこれについて、もう少し深掘りしていきます。
こちら、ルーンと呼ばれるもので、Svelte5から、導入されたものらしいですね。
意味は、
神秘的で魔法的なシンボルとして使用される文字、またはマーク。
なんか魔法感があっていいかも…!
ルーンが導入された理由
こちらのルーンですが、Svelte5から導入されたもので、以前はなかったようです。
一見すると、これは後退しているように見えるかもしれません。Svelte らしくない(un-Svelte-like)、と。デフォルトで let count がリアクティブであるほうが良いのではないか?と。
いいえ、それは違います。実際、アプリケーションが複雑になってくるにつれ、どの値がリアクティブでどの値がリアクティブでないのか判別するのが難しくなってくるのです。また、このヒューリスティックはコンポーネントのトップレベルにある let 宣言でのみ機能するため、混乱を招く可能性があります。コードの振る舞いが .svelte ファイル内と .js で異なっていると、コードのリファクタリングが難しくなります。例えば、何かを store にして複数の場所で使えるようにする必要がある場合などです。
むむむ。どうやら、アプリケーションが複雑になってくると、リアクティブな値の判別が難しくなってくるようですね。
実際に比較してみましょう。
<script>
let count = 0;
function handleClick() {
count += 1;
}
$: doubled = count * 2;
</script>
<button on:click={handleClick}>
Clicked {count}
{count === 1 ? "time" : "times"}
</button>
<p>{count} doubled is {doubled}</p>
これがSvelte5以前のコード
<script>
let count = $state(0);
function handleClick() {
count += 1;
}
let doubled = $derived(count * 2);
</script>
<button onclick={handleClick}>
Clicked {count}
{count === 1 ? "time" : "times"}
</button>
<p>{count} doubled is {doubled}</p>
これがSvelte5のコード。
これぐらいのコード規模だとまだ判別しやすいけど、確かに規模が大きくなってくると、あれ? これリアクティブな変数だっけ? って見分けがつかなくなりそうです。
変数名で工夫する方法もあるとは思いますが、変えた方が都合がよかったんでしょうね。たぶん。
そもそもリアクティブな変数とは?
リアクティブ変数は、その変数を変更するだけで、画面に変更が反映される変数です。
前回と同様に、ボタンを押したときに、カウントアップするプログラムを例にあげます。

シンプルにこんなやつ。
リアクティブ変数がない状態だと、こんな感じ
<script>
let count = 0;
function incCounter()
{
count++;
document.getElementById("counter").innerHTML = "count:" + count;
}
</script>
<button id="counter" onClick="incCounter()">count:0</button>
リアクティブ変数がある場合、こんな感じ
<script>
let count = $state(0);
function incCounter() {
count += 1;
}
</script>
<button onclick={incCounter}>
count:{count}
</button>
比べてみると、結構シンプルに書ける印象ですね!
このコードの例だと、まだ恩恵は少ないかもしれないですが、
要素が増えてくると、内容が書き換わっているかなどのチェック項目が増えるので、
確かに便利そうです!
リアルタイムに値が書き換わっている感じも、なんか見てて楽しい
ルーンの種類
そんなルーンの種類ですが、大きく分けて7つ存在するらしいです。