代码之家  ›  专栏  ›  技术社区  ›  sinan

单选按钮onChange函数不更新app-React的状态

  •  0
  • sinan  · 技术社区  · 6 年前

    我在努力学习如何反应,但却固执己见。我也查过其他题目,但找不到答案。

    我正试图用开/关单选按钮关闭应用程序。当我第一次运行应用程序时,按Q可以播放声音。当我关掉收音机,但它不再工作,这是我正在努力做的。但是当我再次点击单选按钮时,它不会播放任何声音。

    我也愿意接受你的建议来优化我的代码。

    let { Button, ButtonToolbar, ButtonGroup, Radio } = ReactBootstrap;
    
    class App extends React.Component {
      constructor(props){
        super(props);
        this.state = {
            power: true,
        };
        this.playSound = this.playSound.bind(this);
        this.turnItOff = this.turnItOff.bind(this);
        const bankOne = [{
        keyCode: 81,
        keyTrigger: 'Q',
        id: 'Heater-1',
        url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-1.mp3'
      }, {
        keyCode: 87,
        keyTrigger: 'W',
        id: 'Heater-2',
        url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-2.mp3'
      }, {
        keyCode: 69,
        keyTrigger: 'E',
        id: 'Heater-3',
        url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-3.mp3'
      }, {
        keyCode: 65,
        keyTrigger: 'A',
        id: 'Heater-4',
        url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-4_1.mp3'
      }, {
        keyCode: 83,
        keyTrigger: 'S',
        id: 'Clap',
        url: 'https://s3.amazonaws.com/freecodecamp/drums/Heater-6.mp3'
      }, {
        keyCode: 68,
        keyTrigger: 'D',
        id: 'Open-HH',
        url: 'https://s3.amazonaws.com/freecodecamp/drums/Dsc_Oh.mp3'
      }, {
        keyCode: 90,
        keyTrigger: 'Z',
        id: "Kick-n'-Hat",
        url: 'https://s3.amazonaws.com/freecodecamp/drums/Kick_n_Hat.mp3'
      }, {
        keyCode: 88,
        keyTrigger: 'X',
        id: 'Kick',
        url: 'https://s3.amazonaws.com/freecodecamp/drums/RP4_KICK_1.mp3'
      }, {
        keyCode: 67,
        keyTrigger: 'C',
        id: 'Closed-HH',
        url: 'https://s3.amazonaws.com/freecodecamp/drums/Cev_H2.mp3'
      },
    ];
        this.audio = new Audio(bankOne[1].url)
      }
      
      playSound(){
        if (this.state.power == true) {
          return this.audio.play();
        }
      };
      
      turnItOff() {
        if (this.state.power == true) {
        this.setState({
          power: false
        })      
        } else {
        this.setState({
          power: false
        })        
        }
      };
      
      render(){
        return(
        <div id='container' >
          <div className='buttons' >
            <div className='firstLine'>
              <ButtonToolbar>
                <Button bsStyle="primary" className='drum-pad' bsSize="large"  onClick = {this.playSound}>Q</Button>
                <Button bsStyle="primary" className='drum-pad' bsSize="large">W</Button>
                <Button bsStyle="primary" className='drum-pad' bsSize="large">E</Button>
              </ButtonToolbar>
            </div>
            <div className='firstLine'>
              <ButtonToolbar>
                <Button bsStyle="primary" className='drum-pad' bsSize="large">A</Button>
                <Button bsStyle="primary" className='drum-pad' bsSize="large">S</Button>
                <Button bsStyle="primary" className='drum-pad' bsSize="large">D</Button>
              </ButtonToolbar>   
            </div>  
            <div className='firstLine'>
              <ButtonToolbar>
                <Button bsStyle="primary" className='drum-pad' bsSize="large">Z</Button>
                <Button bsStyle="primary" className='drum-pad' bsSize="large">X</Button>
                <Button bsStyle="primary" className='drum-pad' bsSize="large">C</Button>
              </ButtonToolbar>   
            </div>
          </div>
          <div className='setting'>
            <div>
              <ButtonGroup className='radio' >
                <Radio name="groupOptions" defaultChecked onChange = {this.turnItOff} >ONN</Radio>     
                <Radio name="groupOptions" onChange = {this.turnItOff}>OFF</Radio>  
              </ButtonGroup>
            </div>
            <div>
              <div id='display' />          
            </div>
            <div>
              <ButtonGroup className='radio' >
                <Button bsStyle="success">Vol +</Button>
                <Button bsStyle="danger">Vol -</Button>
              </ButtonGroup>
              <ButtonGroup className='changeTune' >
                <Radio name="groupOptions">Flute Kit</Radio>           
                <Radio name="groupOptions">Piano Kit</Radio>  
              </ButtonGroup>          
            </div>
          </div>
        </div>
        )
      }
    }
    
    ReactDOM.render(
    	<App/>,
        document.getElementById('drum-machine')
    );
    #container{
      background-color:#f5f5f5;
      margin: 30px auto;
      width: 30%;
      height: 200px;
      border: 3px solid #337ab7;
      padding: 10px;
    }
    
    .buttons{
      float:left;
    }
    
    .radio{
      display:inline-block;
      margin: 4px;
    }
    
    .firstLine {
      margin: 10px;
    }
    
    #display{
      background-color: #337ab7;
      float: left;
      width: 180px;
      height: 40px;
      color: white;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-bootstrap/0.32.1/react-bootstrap.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
    
    <div id='drum-machine'></div>
    3 回复  |  直到 6 年前
        1
  •  2
  •   Colin Ricardo    6 年前

    这:

      turnItOff() {
        if (this.state.power == true) {
          this.setState({
            power: false
          });
        } else {
          this.setState({
            power: false
          });
        }
      }
    

    应该是这样的:

    toggle() {
      this.setState({ power: !this.state.power });
    }
    

    你拥有它的方式,它将永远 power 成为 false .

        2
  •  0
  •   Dhananjai Pai    6 年前
    if (this.state.power == true) {
        this.setState({
        power: false
    })      
    } else {
    this.setState({
      power: false
    })        
    

    if和else语句都在做同样的事情?你能检查一下逻辑吗?

        3
  •  0
  •   Sankalp    6 年前

    有问题了,

    在关闭方法上状态没有正确更改。

    更新代码如下:

     turnItOff() {
    if (this.state.power == true) {
    this.setState({
      power: !this.state.power
    })      
    } else {
    this.setState({
      power: !this.state.power
    })        
    }
    

    };

    fiddle here