これまで見てきたすべての例では、<script>
ブロックには各コンポーネントのインスタンスが初期化されたときに実行されるコードが含まれています。大部分のコンポーネントでは、これだけで十分です。
ごく稀に、個々のコンポーネントのインスタンスの外でコードを実行しなければならないことがあります。例えば、以前の演習 のカスタムオーディオプレーヤーを振り返ると、4つの曲を同時に再生することができましたが、1つを再生すると他のすべてのオーディオプレーヤーが停止した方がより良いでしょう。
これを実現するには、<script module>
ブロックを宣言します。ここに含まれるコードは、コンポーネントがインスタンス化されたときではなく、モジュールが最初に評価されたときに一度だけ実行されます。これを AudioPlayer.svelte
の先頭に配置してください (これは 別個の script タグであることにご注意ください)。
AudioPlayer
<script module>
let current;
</script>
これで状態を管理することなく、コンポーネント同士がお互いに「会話」することが可能になりました。
AudioPlayer
<audio
src={src}
bind:currentTime={time}
bind:duration
bind:paused
onplay={(e) => {
const audio = e.currentTarget;
if (audio !== current) {
current?.pause();
current = audio;
}
}}
onended={() => {
time = 0;
}}
/>
previous next
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script>
import AudioPlayer from './AudioPlayer.svelte';
import { tracks } from './tracks.js';
</script>
<div class="centered">
{#each tracks as track}
<AudioPlayer {...track} />
{/each}
</div>
<style>
.centered {
display: flex;
flex-direction: column;
height: 100%;
justify-content: center;
gap: 0.5em;
max-width: 40em;
margin: 0 auto;
}
</style>