前の演習では、コンポーネント内でリアクティビティを追加するためにruneを使用しました。しかし、グローバルなステートを共有するために、コンポーネントの*外部*でもruneを使用できます。
この演習の<Counter>
コンポーネントはすべて、shared.js
からcounter
オブジェクトをインポートしています。しかし、これは通常のオブジェクトであり、ボタンをクリックしても何も起こりません。オブジェクトを$state(...)
でラップしてください。
共有
export const counter = $state({
count: 0
});
通常の.js
ファイルではruneを使用できず、.svelte.js
ファイルでのみ使用できるため、エラーが発生します。これを修正しましょう — ファイル名をshared.svelte.js
に変更します。
次に、Counter.svelte
のインポート宣言を更新します。
カウンター
<script>
import { counter } from './shared.svelte.js';
</script>
これで、いずれかのボタンをクリックすると、3つすべてが同時に更新されます。
宣言が(単にミューテートされるのではなく)再割り当てされた場合、インポーターがそれを知る方法がないため、モジュールから
$state
宣言をエクスポートすることはできません。
1
2
3
4
5
6
7
8
<script>
import Counter from './Counter.svelte';
</script>
<Counter />
<Counter />
<Counter />