简体   繁体   English

我无法在鼓机中单击时播放声音

[英]I can't play sound on click in a drum machine

I want to create a simple react drum machine from freecodecamp.我想从 freecodecamp 创建一个简单的反应鼓机。

I want to render 9 drumpads and play sound on click.我想渲染 9 个鼓垫并在点击时播放声音。

Edit: I can now render all keys but still have problems with the function for playing the sounds for each key on click.编辑:我现在可以渲染所有键,但 function 在点击时播放每个键的声音仍然存在问题。 I used querySelector now but it still doesn't work.我现在使用了 querySelector,但它仍然不起作用。 I have no idea how to fix it.我不知道如何解决它。

import * as React from "https://cdn.skypack.dev/react@17.0.1";
import * as ReactDOM from "https://cdn.skypack.dev/react-dom@17.0.1";

 

function DrumPad() {
  const pads = [
    {
      key: "Q",
      id: "Heat-1",
      url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-1.mp3"
    },
    {
      key: "W",
      id: "Heat-2",
      url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-2.mp3"
    },
    {
      key: "E",
      id: "Heat-3",
      url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-3.mp3"
    },
    {
      key: "A",
      id: "Heat-4",
      url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-4_1.mp3"
    },
    {
      key: "S",
      id: "Clap",
      url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-6.mp3"
    },
    {
      key: "D",
      id: "Open-HH",
      url: "https://s3.amazonaws.com/freecodecamp/drums/Dsc_Oh.mp3"
    },
    {
      key: "Z",
      id: "Kick-n-Hat",
      url: "https://s3.amazonaws.com/freecodecamp/drums/Kick_n_Hat.mp3"
    },
    {
      key: "X",
      id: "Kick",
      url: "https://s3.amazonaws.com/freecodecamp/drums/RP4_KICK_1.mp3"
    },
    {
      key: "C",
      id: "Closed-HH",
      url: "https://s3.amazonaws.com/freecodecamp/drums/Cev_H2.mp3"
    }
  ];

  return (
    <>
      {pads.map((pad) => (
        <div
          key={pad.id}
          className="drum-pad"
          id={pad.id}
          onclick={function () {
            const sound = document.querySelector("audio[id=" + pad.key + "]");
            sound.play();
          }}
        >
          {pad.key}
          <audio id={pad.key} src={pad.url} />
        </div>
      ))}
    </>
  );
}

const App = () => {
  return (
    <div>
      <div id="drum-machine">
        <DrumPad />
      </div>
    </div>
  );
};

ReactDOM.render(<App />, document.getElementById("root"));

Since you are returning within a for loop, the component will return during the first iteration of the loop which means the function call will end.由于您在 for 循环中返回,因此组件将在循环的第一次迭代期间返回,这意味着 function 调用将结束。 This is why only one key is rendered.这就是为什么只呈现一个键的原因。

In React.js we usually do array.map() instead of for loops.在 React.js 中,我们通常使用array.map()而不是 for 循环。 Something like:就像是:

 function DrumPad() { const pads = [ { key: "Q", id: "Heat-1", url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-1.mp3" }, { key: "W", id: "Heat-2", url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-2.mp3" }, { key: "E", id: "Heat-3", url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-3.mp3" }, { key: "A", id: "Heat-4", url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-4_1.mp3" }, { key: "S", id: "Clap", url: "https://s3.amazonaws.com/freecodecamp/drums/Heater-6.mp3" }, { key: "D", id: "Open-HH", url: "https://s3.amazonaws.com/freecodecamp/drums/Dsc_Oh.mp3" }, { key: "Z", id: "Kick-n-Hat", url: "https://s3.amazonaws.com/freecodecamp/drums/Kick_n_Hat.mp3" }, { key: "X", id: "Kick", url: "https://s3.amazonaws.com/freecodecamp/drums/RP4_KICK_1.mp3" }, { key: "C", id: "Closed-HH", url: "https://s3.amazonaws.com/freecodecamp/drums/Cev_H2.mp3" } ]; return ( <div> {pads.map((pad) => ( <div key={pad.id} className="drum-pad" id={pad.id} onClick={() => { const audio = new Audio(pad.url); audio.play(); }} > {pad.key} </div> ))} </div> ); }; ReactDOM.render( <DrumPad />, document.getElementById("root") );
 <div id="root"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM