У меня есть компонент React, который воспроизводит / приостанавливает звук при нажатии на кнопку.Это прекрасно работает, и я отображаю около 5 из них на странице одновременно.Однако, если вы нажмете кнопку воспроизведения на одном, а затем нажмите кнопку воспроизведения на другом, воспроизводятся оба звука, что не очень хорошо.Вот мой код для компонента:
import React from 'react';
import playIcon from './images/play.png';
import pauseIcon from './images/pause.png';
class Music extends React.Component {
constructor(props) {
super(props);
this.state = { 'play': false };
this.url = props.src;
this.audio = new Audio(this.url);
this.audio.preload = 'none';
this.togglePlay = this.togglePlay.bind(this);
}
togglePlay() {
this.setState({'play': !this.state.play}, () => {
this.state.play ? this.audio.play() : this.audio.pause();
});
}
componentWillUnmount () {
this.audio.pause();
}
render() {
return (
<div style={this.props.style} className={this.props.className}>
{this.state.play
? <button className="audio-button" aria-label="Pause" onClick={this.togglePlay}><img src={pauseIcon} width="34" height="34" alt="Pause"></img></button>
: <button className="audio-button" aria-label="Play" onClick={this.togglePlay}><img src={playIcon} width="34" height="34" alt="Play"></img></button>}
</div>
);
}
}
export default Music;
Я немного осмотрелся, и потенциальное решение состоит в том, чтобы использовать redux или какую-либо другую библиотеку управления состоянием.Я бы хотел этого избежать, так как в остальном я не нуждаюсь в этом на этом сайте.Я посмотрел на слушателей событий (а именно, решение , предложенное здесь ), но когда я делаю document.getElementsByTagName('audio')
, я получаю пустое HTMLCollection
. Это решение ближе, но я не могу преодолеть разрыв между его реализацией в jQuery и той, которую я использую в React.
Есть ли способ идентифицировать воспроизводимый звук и приостановить его из компонента React перед воспроизведением нового звука?Любые и все предложения приветствуются.