【发布时间】:2021-07-16 03:17:10
【问题描述】:
单击<img /> 时,我正在尝试播放/停止音频。每个<img /> 都与不同的音频文件相关。音频应该在用户不停止的情况下循环播放。我更喜欢不使用类组件,因为我可以使用钩子。
我的实际代码不会停止音频;不要循环它;如果我单击两次,音频就会重叠(同时发出两个声音)。
import myJSON from "./assets/myJSON.json";
export default function Card() {
const handleClick = (argument) => {
new Audio(argument.target.dataset.sound).play()
}
return (
<>
{myJSON.map((myObject, index) => {
return (
<img
src={myObject.image}
alt={myObject.name}
key={index}
onClick={handleClick}
data-sound={myObject.sound}
/>
);
})}
</>
);
}
我可以随意更改 json 或尝试不同的方法。
【问题讨论】:
-
您的点击事件所做的只是播放 URL... 您需要添加状态以允许组件知道它当前是否正在播放。并根据需要修改状态...
-
同意,我建议还使用 ref 来存储当前正在播放的音频元素,以便您可以切换该流的播放/暂停状态。如果用户点击播放另一个声音,您还可以停止任何正在播放的流(除非您希望它们同时播放)。
标签: reactjs react-hooks html5-audio