#javascript #reactjs #next.js #html5-audio
Вопрос:
У меня есть ReactJS
NextJS
приложение, в котором есть Audio
компонент. Всякий source
раз, когда он обновляется, я хочу, чтобы приложение load()
, а также play()
недавно выбранный трек немедленно (без необходимости пользователю самому нажимать play
. В настоящее время обновление исходного кода просто загружает новую дорожку в плеер и не запускает воспроизведение.
Значение source
на index
странице задается через a hook
, доступ к которому осуществляется через React
Context
API
:
const [trackToPlay, setTrackToPlay] = useState("SELECT A CHAPTER");
Ниже приведен аудиокомпонент. На Index
странице, source
из плеера устанавливается динамически:
<audio ref={audioPlayer} preload="metadata" id="a1" src={{
"/": `${trackToPlay}.mp3`,
}[router.asPath]
}
type="audio/mpeg"
></audio>
Ниже приведена togglePlayPause
функция, которая обращается к audioPlayer
Ref
hook
, но, как вы можете видеть, она не запускается при включении Src
. Это срабатывает при user
нажатии play
:
const togglePlayPause = () => {
const prevValue = isPlaying;
setIsPlaying(!prevValue);
if (!prevValue) {
audioPlayer.current.play();
animationRef.current = requestAnimationFrame(whilePlaying);
} else {
audioPlayer.current.pause();
cancelAnimationFrame(animationRef.current);
}
};
Эта функция обновляет источник, но это просто крюк реакции, который не влияет на статус воспроизведения:
<div
className={styles.track}
onClick={() => {
changeTrack(d.chapter);
changeTrackTime(d.time);
}}
>
<--trackName-->
</div>
Как я могу инициировать play
выбор нового трека? Я думаю, что мне нужно использовать useEffect
для повторного load()
togglePlayPause
ввода fn всякий раз, когда src меняется, но я не совсем уверен, как это сделать.