javascript - 恰好 1 秒后暂停 React 中的音频播放
问题描述
我在下面这些行中创建的音频按我的意愿播放,但我也希望它在 1 秒后停止播放。我尝试了多种方法,例如在之后使用三元运算符this.togglePlay()
或使用 this.audio.pause(),或在 setTimeout 内暂停它,但在 1 秒后完全停止音频没有任何作用。该项目的所有代码都可以在这个codepen上找到,虽然我不确定为什么它不会呈现输出,它是从我的 vscode 呈现的。我已经为此工作了几个小时,因此感谢您的帮助,谢谢。
audio = new Audio(
"https://raw.githubusercontent.com/freeCodeCamp/cdn/master/build/testable-projects-fcc/audio/BeepSound.wav"
);
componentDidMount() {
this.audio.addEventListener("ended", () => this.setState({ play: false }));
}
componentWillUnmount() {
this.audio.removeEventListener("ended", () =>
this.setState({ play: false })
);
}
togglePlay = () => {
this.setState({ play: !this.state.play }, () => {
this.state.play ? this.audio.play() : this.audio.pause();
});
};
它在这里的 start_break 函数中触发:
start_break = () => {
if (this.state.cycle === "break") {
this.togglePlay();
let label = (document.getElementById("mainLabel").innerHTML =
"Break Time");
this.breakTimer = setInterval(() => {
const { seconds, minutes, break_length } = this.state;
if (seconds > 0) {
this.setState(({ seconds }) => ({
seconds: seconds - 1,
}));
}
if (seconds === 0) {
if (break_length === 0) {
clearInterval(this.break_Timer);
} else {
let newMinuteValue = break_length - 1;
this.setState(({ minutes }) => ({
minutes: newMinuteValue,
break_length: newMinuteValue,
seconds: 59,
}));
// this.audio.play()
}
}
}, 100);
}
};
解决方案
我认为这可能是您问题的答案:
import React, { useState, useEffect } from "react";
const useAudio = url => {
const [audio] = useState(new Audio(url));
const [playing, setPlaying] = useState(false);
const toggle = () => setPlaying(!playing);
useEffect(() => {
playing ? audio.play() : audio.pause();
},
[playing]
);
useEffect(() => {
audio.addEventListener('ended', () => setPlaying(false));
return () => {
audio.removeEventListener('ended', () => setPlaying(false));
};
}, []);
return [playing, toggle];
};
const Player = ({ url }) => {
const [playing, toggle] = useAudio(url);
return (
<div>
<button onClick={toggle}>{playing ? "Pause" : "Play"}</button>
</div>
);
};
export default Player;
推荐阅读
- javascript - VS Code:如何将所有默认的 HTML 文件片段添加到反应 js 文件中?
- python - 向 Selenium linkedin_scraper 代码添加一个打开关闭的 Google Chrome 浏览器
- react-native - react-native-calendars 更新 CalanderList 开始月份的状态变化
- reactjs - 使用demo或root的目的是什么
- angular - 在页面调整大小时更新变量
- reactjs - 在多次触发的 chrome 扩展中更新反应钩子?
- javascript - TypeError:无法读取未定义 discord.js 的属性“查找”
- row - 多行计算
- python - 接受两个函数并返回连接函数的 Python 函数?
- cuda - 如何在 CUDA 中重用代码用于 CPU 回退