Skip to main content

これまで見てきたすべての例では、<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;
	}}
/>

Edit this page on GitHub

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>