【问题标题】:How do I setState when my drum-pad triggers an onClick function?当我的鼓垫触发 onClick 功能时如何设置状态?
【发布时间】:2020-10-09 04:56:50
【问题描述】:

我是 React 的新手,目前正在构建鼓机。我已经连接了鼓机以播放包含在其 DrumPad 子组件中的音频。我的问题是,每当单击其父鼓垫 div 时,我无法创建一个表示每个音频显示的 id。我知道我需要初始化 state 然后 setState 但我不知道如何在我的代码中实现它。

这是我的代码

import React from 'react';
import './App.css';
import soundData from "./soundData.js"
import DrumPad from "./drumPad.js"

class App extends React.Component {
  constructor(props){
   super(props)
     this.state = {
       display : "hello",
      }
      this.handleDisplay = this.handleDisplay.bind(this)
    }

    
 handleDisplay (){
   this.setState({display: }) //what do i need to do here?
 }


    render(){
    
    return(
     <div 
     id="drum-machine" 
     >
       
     <div
     id="display"
     >
       {this.state.display}
     </div>
     {soundData.map((data) => 
     (
        <DrumPad 
        data={data} 
        key={data.letter} 
        id = {data.id}
        handleDisplay = {this.handleDisplay}
        
        
         />
      ))}
     </div>

    )
     }
  }


export default App;
**drumPad.js**
import React from "react"


function DrumPad(props){
    
  function handleClick(){
        
        const audio =  new Audio(props.data.src)
        audio.play()
        audio.currentTime = 0  
       
        }
 
        return(
            <div 
            className= "drum-pad" 
            id = {props.data.id} 
            onClick = {handleClick}

            >
                <h1>{props.data.letter}</h1>
                <audio 
                className = "clip" 
                id = {props.data.letter} 
                src = {props.data.src}
                
                />            

            </div>

        )
    
}

    
export default DrumPad

**soundData.js**

const soundData = [{ 

 letter:"Q",
 src:"https://raw.githubusercontent.com/wesbos/JavaScript30/master/01%20-%20JavaScript%20Drum%20Kit/sounds/clap.wav",
 id: "clap"

},{

 letter:"W",
    src: "https://raw.githubusercontent.com/wesbos/JavaScript30/master/01%20-%20JavaScript%20Drum%20Kit/sounds/hihat.wav",
    id:"hihat"
 }, {

    letter:"E",
    src: "https://raw.githubusercontent.com/wesbos/JavaScript30/master/01%20-%20JavaScript%20Drum%20Kit/sounds/kick.wav",
    id:"kick"
  },{

    letter:"A",
    src: "https://raw.githubusercontent.com/wesbos/JavaScript30/master/01%20-%20JavaScript%20Drum%20Kit/sounds/openhat.wav",
    id:"openhat"
   },{

    letter:"S",
    src: "https://raw.githubusercontent.com/wesbos/JavaScript30/master/01%20-%20JavaScript%20Drum%20Kit/sounds/boom.wav",
    id:"boom"
 },{

    letter:"D",
    src: "https://raw.githubusercontent.com/wesbos/JavaScript30/master/01%20-%20JavaScript%20Drum%20Kit/sounds/ride.wav",
    id:"ride"
 },{

    letter:"Z",
    src: "https://raw.githubusercontent.com/wesbos/JavaScript30/master/01%20-%20JavaScript%20Drum%20Kit/sounds/snare.wav",
    id:"snare"
 },{

    letter:"X",
    src: "https://raw.githubusercontent.com/wesbos/JavaScript30/master/01%20-%20JavaScript%20Drum%20Kit/sounds/tom.wav",
    id:"tom"
 },
{

    letter:"C",
    src: "https://raw.githubusercontent.com/wesbos/JavaScript30/master/01%20-%20JavaScript%20Drum%20Kit/sounds/tink.wav",
    id:"tink"
 }]

   export default soundData

【问题讨论】:

  • 为什么要将handleDisplay 传递给DrumPad 组件?为什么需要handleDisplay
  • 这段代码没有任何意义。看起来您正在尝试同时做几件事并混淆它们。
  • @kalhan 当触发 .drum-pad 时,我想要一个描述关联音频剪辑的字符串,显示为 #display 元素的内部文本。
  • @JMadelaine 就像我之前说的,我是 React 新手,这是我的第一个项目。我希望您能帮助我使我的代码更简洁,谢谢。

标签: javascript reactjs


【解决方案1】:

为了更新状态,你需要将函数handleDisplay传递给DrumPad,并在handleClick内部调用handleDisplay,将需要的数据作为参数传递。

CodeSandbox

//App.js    
handleDisplay(key) {
    this.setState({
      display: key
    });
  }

//DrumPad.js
  function handleClick() {
    const audio = new Audio(props.data.src);
    audio.play();
    audio.currentTime = 0;
    props.handleDisplay(`${props.data.letter} : ${props.data.id}`);
  }

【讨论】:

  • 除了我必须删除 ${props.data.letter} 以使其仅显示 data.id 之外,这对我来说非常有用。谢谢
猜你喜欢
  • 2021-06-30
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
相关资源
最近更新 更多