setState React не работает при нажатии кнопки

#reactjs

#reactjs

Вопрос:

Я написал следующий JSX в соответствии с документами, но состояние не отражает изменений в зависимости от нажатия кнопки.

В чем может быть причина?

 import React from 'react';
import 'bootstrap/dist/css/bootstrap.css';
import 'react-datasheet/lib/react-datasheet.css';

export default class TableCode extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 1 }
  };

  handleButtonClick(event) {
    this.setState({ count: 2 })
  }

  render() {
    return (
      <button type="button" class="btn btn-primary m-3" onclick={this.handleButtonClick.bind(this)}>Generate Code</button>
    );
  }
}
  

Ответ №1:

Сначала используйте функцию со стрелкой, поскольку она не требует привязки.Плюс onclick орфография была неправильной, поскольку react использует camelCase onClick .

 constructor(props) {
      super(props);
      this.state = { count: 1 }
    };
  
    handleButtonClick=(event) =>{

      this.setState({ count: 2 })
     //console.log(event);
    }
    
    render() {
      console.log(this.state.count);
  
      return (
        <button type="button" class="btn btn-primary m-3" onClick={()=>{this.handleButtonClick()}}>Generate Code</button>
      );
    }
  

Или второе решение, как вы хотите, с помощью метода bind.

 constructor(props) {
        super(props);
        this.state = { count: 1 }
        this.handleButtonClick = this.handleButtonClick.bind(this)
      };
    
      handleButtonClick() {
        this.setState({ count: 2 })
      }
    
      render() {
        console.log(this.state.count);
        return (
          <button type="button" class="btn btn-primary m-3" onClick={this.handleButtonClick}>Generate Code</button>
        );
      }
    }
  

Ответ №2:

 import React from 'react';
import 'bootstrap/dist/css/bootstrap.css';
import 'react-datasheet/lib/react-datasheet.css';

export default class TableCode extends React.Component {
  constructor(props) {
    super(props);
    this.state = { count: 1 }
  };

  render() {
    return (
      <button type="button" class="btn btn-primary m-3" 
       onClick={() => this.setState({ count: 2})}>Generate Code</button>
    );
  }
}
  

Ответ №3:

Ваш код в порядке, вам просто нужно изменить onclick на onClick .

 render() {
  return (
    <button type="button" className="btn btn-primary m-3" onClick={this.handleButtonClick.bind(this)}>Count is {this.state.count}</button>
  );
}
  

В JSX заглавные буквы атрибутов важны и отличаются от обычного HTML.

class также следует изменить на className .