メインコンテンツにスキップ

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

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>