Класс React: setState ничего не делает (и об ошибках не сообщается)

У меня есть класс React с этим конструктором:

class AddList extends Component {
constructor(props){
  super(props);
  this.state = { hidden: true };
}

Тогда у меня есть эта функция:

handleSubmit(e) {
e.preventDefault(); // this prevents the page from reloading -- do not     delete this line!

// Implement the rest of this function here!
alert('this.state.hidden: ' + this.state.hidden);
if (this.state.hidden == true){
  alert('setting hidden to false');
  this.setState({hidden: false});
  }
  else{
    alert('setting hidden to true');
    this.setState({hidden: true});
  }
alert('this.state.hidden: ' + this.state.hidden);
    . . . 

My problem is that neither this.setState({hidden: false);
nor                        this.setState({hidden: 'false'); 

Меняет состояние! Поля "alert" подтверждают путь через код, и ТОЛЬКО setState кажется NOP!

2 ответа

В случае, если вы хотите прочитать значения состояния после его обновления, вы можете использовать второй аргумент метода setState, который является функцией обратного вызова. Эта функция обратного вызова выполняется после обновления состояния и повторной визуализации компонента. Например this.setState({ hidden: !this.state.hidden }, function(){ console.log("updated state: " + this.state.hidden); });

setState является асинхронным, и поэтому вы не сможете увидеть обновления после этого. Вот почему вы не видите актуальное значение на вашем последнем alert вызов.

Для получения дополнительной информации проверьте документацию ReactJs: https://facebook.github.io/react/docs/state-and-lifecycle.html

Я написал пример кода на основе вашего:

class AddList extends React.Component {
  constructor(props) {
    super(props)
    
    this.state = { hidden: true }
    
    this.handleSubmit = this.handleSubmit.bind(this)
  }
  
  handleSubmit(event) {
    event.preventDefault()
    
    this.setState({ hidden: !this.state.hidden })
  }
  
  render() {
    return (
      <div>
        <div>State value: {this.state.hidden ? 'hidden' : 'visible'}</div>
        <button onClick={this.handleSubmit}>Click-me</button>
      </div>
    )
  }
 }
 
 ReactDOM.render(<AddList />, document.getElementById('root'))
<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>

<div id="root"></div>

Другие вопросы по тегам