[英]How to make a sound button with React?
我正在尝试使用 TypeScript 用 React 制作鼓。但它总是返回一些错误,我该怎么做?
最后一次尝试是使用 howler 的下面的尝试,但没有用。
import { useState } from "react";
import "./App.css";
import kick from "./assets/kick.mp3";
import snare from "./assets/snare.mp3";
import hiHat from "./assets/hi-hat.mp3";
import tom from "./assets/tom.mp3";
import clap from "./assets/clap.mp3";
import shaker from "./assets/shaker.mp3";
import tambourine from "./assets/tambourine.mp3";
import cymbal from "./assets/cymbal.mp3";
import cowbell from "./assets/cowbell.mp3";
import { Howl, Howler } from "howler";
const sounds = [
{ key: "Q", name: "Kick", src: kick },
{ key: "W", name: "Snare", src: snare },
{ key: "E", name: "Hi-hat", src: hiHat },
{ key: "A", name: "Tom", src: tom },
{ key: "S", name: "Clap", src: clap },
{ key: "D", name: "Shaker", src: shaker },
{ key: "Z", name: "Tambourine", src: tambourine },
{ key: "X", name: "Cymbal", src: cymbal },
{ key: "C", name: "Cowbell", src: cowbell },
];
function App() {
const [display, setDisplay] = useState("");
const handlePlay = (src: any) => {
setDisplay(src);
const audio = new Howl({ src });
audio.play();
};
const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {
const sound = sounds.find((s) => s.key === event.key.toUpperCase());
if (sound) handlePlay(sound.name);
};
Howler.volume(1.0);
return (
<div id="drum-machine" onKeyDown={handleKeyDown} tabIndex={0}>
<div id="display">{display}</div>
<div id="pad-container">
{sounds.map((sound) => (
<button
className="drum-pad"
id={sound.name}
key={sound.key}
onClick={() => handlePlay(sound.name)}
>
{sound.key}
<audio id={sound.key} />
</button>
))}
</div>
</div>
);
}
export default App;
尝试使用<audio>
标签但也不起作用,我认为问题出在导入上但我不知道,一切看起来都很好。
根据我从 Howler 的文档中收集到的信息,
Howl
的 src 属性接受一组源(每种格式 1 个源)所以你可以尝试这样的事情:// use the path to the sound file instead of the imported sound file itself
const sounds = [
{ key: "Q", name: "Kick", src:"./assets/kick.mp3" },
];
function App() {
const [display, setDisplay] = useState("");
const handlePlay = (src: any) => {
setDisplay(src);
// pass an array instead of string
const audio = new Howl({ src: [src] });
audio.play();
};
// Your rest of the App
}
您不能 JS 导入 mp3,新的 Howl 需要一个带有 mp3 字符串路径的数组。 请参阅github中的示例。
你可能会做这样的事情:
const sounds = [
{ key: "Q", name: "Kick", src: "./assets/kick.mp3" },
{ key: "W", name: "Snare", src: "./assets/snare.mp3" },
{ key: "E", name: "Hi-hat", src: "./assets/hi-hat.mp3" },
{ key: "A", name: "Tom", src: "./assets/tom.mp3" },
{ key: "S", name: "Clap", src: "./assets/clap.mp3" },
{ key: "D", name: "Shaker", src: "./assets/shaker.mp3" },
{ key: "Z", name: "Tambourine", src: "./assets/tambourine.mp3" },
{ key: "X", name: "Cymbal", src: "./assets/cymbal.mp3" },
{ key: "C", name: "Cowbell", src: "./assets/cowbell.mp3" }
];
//Then
const handlePlay = (sound) => {
setDisplay(sound.name);
const audio = new Howl({ src: [sound.src] });
audio.play();
};
问题解决了,我正在使用“howler”库。 已弃用,更改为“react-crowler”和 function handlePlay。 然后它起作用了。
function handlePlay() 变成这样:
const handlePlay = (src: any) => {
const sound = new Howl({
src,
html5: true,
});
sound.play();
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.