Подтвердить что ты не робот

React - Состояние не обновлено

Здесь я пытаюсь установить state.autocomplete на "привет", а затем распечатать его, но состояние кажется нулевым. Как это может быть, когда я просто обновляю состояние с помощью setState? data устанавливается как глобальная переменная.

  var data = {
    populate_at: ['web_start', 'web_end'],
    autocomplete_from: ['customer_name', 'customer_address']
  };


  var AutocompleteFromCheckboxes = React.createClass({
    handleChange: function(e) {
      this.setState( { autocomplete_from: 'event.target.value' } );
      console.log('autocompleteFrom state: ', this.state.autocomplete_from);
      // ^  => Uncaught TypeError: Cannot read property 'autocomplete_from' of null
      return 1;
    },
    render: function() {
      var autocompleteFrom = this.props.autocomplete_from.map(function(value) {
        return (
          <label for={value}>
            <input type="checkbox" name={value} value="{value}"
              onChange={this.handleChange.bind(this)}
              ref="autocomplete-from"/>
            {value}
          </label>
        );
      }, this);
      return (
        <div className="autocomplete-from">
          {autocompleteFrom}
        </div>
      );
    }
  });

  var DynamicForm = React.createClass({
    getInitialState: function() {
      return {
        name              : null,
        populate_at       : null,
        same_as           : null,
        autocomplete_from : "not set",
        title             : null
      };
    },
    saveAndContinue: function(e) {
      e.preventDefault();
      var data = {
        name     : this.refs.name.getDOMNode().value,
      };
      console.log('data: ' + data.name);
    },

    render: function() {
      return (
          <AutocompleteFromCheckboxes
            autocomplete_from={this.props.data.autocomplete_from} />
      );
    }
  });


  var mountpoint = document.getElementById('dynamic-form');
  if ( mountpoint ) {
    React.render(<DynamicForm data={data} />, mountpoint);
  }

});
4b9b3361

Ответ 1

Из реакционных документов:

setState() не сразу мутирует this.state, а создает ожидающий переход состояния. Доступ к this.state после вызова этого метода может потенциально вернуть существующее значение.

https://facebook.github.io/react/docs/component-api.html

Что вы можете сделать, это передать функцию обратного вызова в setState, которая запускается после обновления состояния:

this.setState(
    {autocomplete_from: ...}, 
    function () {
        ... at this point the state of the component is set ...
    }
)

Ответ 2

Вам нужно установить начальное состояние вашего компонента, попробуйте добавить следующее к вершине вашего компонента.

getInitialState: function() {
  return {
   autocomplete_from: ''
  };
}

ИЗМЕНИТЬ:

В вашем компоненте DynamicFrom у вас есть:

render: function() { return ( <AutocompleteFromCheckboxes autocomplete_from={this.props.data.autocomplete_from} /> ); }

Поскольку вы пытаетесь ссылаться на состояние, вы должны написать autocomplete_form={this.state.autocomplete_from}

Также вы пытаетесь установить состояние из дочернего компонента и не должны напрямую изменять состояние. Лучший способ приблизиться к этому - передать функцию DynamicFrom (удерживает состояние) в AutocompleteFromCheckboxes. Таким образом.

var DynamicForm = React.createClass({ handleChange: function(value) { this.setState({autocompelete_from: value}); }, render: function() { return( <AutocompleteFromCheckboxes autocomplete_from={this.state.autocomplete_from} handleChange={this.handleChange} /> ); }, .... });

Затем вызовите эту функцию в дочернем компоненте

AutocompleteFromCheckboxes = React.createClass({ .... onChange={this.handleChange} .... handleChange: function(e) { this.props.handleChange(e.target.value); } });