React でオーディオ プレーヤーを実装する

Irakli Tchigladze 2023年6月21日
  1. React でオーディオ プレーヤーを実装するためのクラス コンポーネントを作成する
  2. React でオーディオ プレーヤーを実装する機能コンポーネントを作成する
React でオーディオ プレーヤーを実装する

React アプリケーションは、ビジュアル コンテンツを表示するためだけのものではありません。 オーディオコンテンツも不可欠な場合があります。

音楽を再生するように React コンポーネントを構成し、必要に応じて再生を一時停止および再開するボタンを設定できます。

React でオーディオ プレーヤーを実装するためのクラス コンポーネントを作成する

React では、ES6 クラス コンポーネント構文を使用してコンポーネントを作成し、任意の音楽ファイルを再生できます。 そのために、状態、ネイティブの Audio() コンストラクター、ライフサイクル フックなど、複数の機能を利用します。

オーディオを再生する React クラス コンポーネントを作成する方法の実際の例を見てみましょう。

class PlayMusic extends React.Component {
  state = {
    songplaying: false
  };
  song = new Audio(
    "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"
  );
  componentDidMount() {
    this.song.addEventListener("ended", () =>
      this.setState({ songplaying: false })
    );
  }

  componentWillUnmount() {
    this.song.removeEventListener("ended", () =>
      this.setState({ songplaying: false })
    );
  }

  switchPlay = () => {
    this.setState({ songplaying: !this.state.songplaying }, () => {
      this.state.songplaying ? this.song.play() : this.song.pause();
    });
  };

  render() {
    return (
      <div>
        <button onClick={this.switchPlay}>
          {this.state.songplaying ? "Pause" : "Play"}
        </button>
      </div>
    );
  }
}

ここには PlayMusic コンポーネントがあり、songplaying と呼ばれる 1つのプロパティで状態を開始します。 ユーザーがこの Web サイトにアクセスしたときにオーディオを再生したくないので、デフォルトでは、songplaying 状態プロパティは false になります。

次に、Audio() コンストラクターのインスタンスを作成し、それを song という変数に格納します。 このコンストラクターは、オーディオ ファイルへの 1つの引数 (URL) を取ります。

次に、ライフサイクル メソッド componentDidMount()componentWillUnmount() を使用して、Audio() のインスタンスである song 変数の ended イベントのイベント リスナーを設定および削除します。 コンストラクタ。 また、ended イベントを処理する関数を設定します。

setState() メソッドを呼び出して、songplaying 状態プロパティの値を変更します。 オーディオ ファイルが終了したら、状態変数を false に設定する必要があります。

最後に、ボタンが 1つある <div> コンテナを返します。 このボタンをクリックすると、switchPlay 関数を実行する onClick イベントがトリガーされます。

this.setState() メソッドは、songplaying プロパティの値を現在の値の反対に設定します。 state プロパティが現在 false の場合は true に設定され、その逆も同様です。

さらに、状態値が true の場合、イベント ハンドラーは Audio() コンストラクターのインスタンスで .play() メソッドを呼び出します。 オーディオが false の場合、代わりに .pause() メソッドを呼び出します。

最後に、条件付きでボタン テキストを表示します。 曲が現在再生中の場合は、Pause テキストが表示されます。 そうでない場合は、代わりに Play を示します。

この CodeSandbox の例のライブ デモを確認してください。

React でオーディオ プレーヤーを実装する機能コンポーネントを作成する

React バージョン 16.8 以降、React の機能コンポーネントには、クラス コンポーネントと同じ機能が多数あります。 これは、useState()useHook()、およびその他のカスタム フックなどのフックの導入によるものです。

機能コンポーネントに音楽プレーヤーを実装しましょう。 まず、カスタム useAudio フックを定義し、それを MusicPlayer コンポーネントで呼び出します。

import React, { useState, useEffect } from "react";

const useAudio = url => {
  const [song] = useState(new Audio("https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3"));
  const [play, setPlay] = useState(false);

  const toggle = () => setPlay(!play);

  useEffect(() => {
      play ? song.play() : song.pause();
    },
    [play]
  );

  useEffect(() => {
    song.addEventListener('ended', () => setPlay(false));
    return () => {
      song.removeEventListener('ended', () => setPlay(false));
    };
  }, []);

  return [play, toggle];
};

const MusicPlayer = () => {
  const [playMusic, setMusic] = useAudio("https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3");

  return (
    <div>
      <button onClick={setMusic}>{playMusic ? "Pause" : "Play"}</button>
    </div>
  );
};

export default Player;

これは、主に前の例と同じ原則に従って機能します。 主な違いは、ライフサイクル メソッドを使用する代わりに、useEffect() フックを使用してオーディオのイベント リスナーを追加および削除することです。

また、useState() フックを使用して、songplay などの状態変数を定義します。 前者は Audio() コンストラクターへの参照を格納し、後者は音楽のステータスを格納します。

toggle 関数は play 状態変数の現在の値も切り替え、必要に応じて音楽の再生を停止して続行できるようにします。

このカスタム フックを使用すると、オーディオを簡単に設定できます。 曲ファイルへのリンクを提供し、三項演算子を使用して状態変数の値を確認し、それに応じてボタン テキストを表示します。

Irakli Tchigladze avatar Irakli Tchigladze avatar

Irakli is a writer who loves computers and helping people solve their technical problems. He lives in Georgia and enjoys spending time with animals.

LinkedIn