これまですべての例で、<script>
ブロックには、各コンポーネントインスタンスが初期化される際に実行されるコードが含まれていました。ほとんどのコンポーネントでは、それで十分です。
ごくまれに、個々のコンポーネントインスタンスの外部でコードを実行する必要があります。例として、前の演習のカスタムオーディオプレーヤーに戻ると、4つのトラックすべてを同時に再生できます。1つを再生すると、他のすべてが停止する方が良いでしょう。
これは、<script module>
ブロックを宣言することで実現できます。その中に含まれるコードは、コンポーネントがインスタンス化される時ではなく、モジュールが最初に評価される時に一度だけ実行されます。これを AudioPlayer.svelte
の先頭に配置します(これは*別の*スクリプトタグです)。
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;
}}
/>
前へ 次へ
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>