Ошибка с Alt.js и реагировать. Государство не сохраняется

Я использую этот класс для отображения и фильтрации списка. Этот класс также запускает поиск.

Моя проблема, кажется, что функция setState не является немедленной.

FriendActions.getSearchList(this.state.search);

Если я прокомментирую это действия. Console.log напечатает состояние в том виде, в каком оно должно быть. Если нет, состояние "поиск" "исчезнет".

Я думаю, что, возможно, событие изменения - это пожар, прежде чем состояние изменится. Но я понятия не имею.

Надеюсь, я ясно дал понять. Если не можете спросить меня больше информации.

onSearch(event){
    this.setState({search: event.target.value});
    if (this.state.search !== '')


      FriendActions.getSearchList(this.state.search);
  }



 class FriendList extends React.Component {
  constructor(props) {
    super(props);
    this.state = FriendStore.getState();
    this.onChange = this.onChange.bind(this);
    this.filterByUsername = this.filterByUsername.bind(this);

    // limit this function every 200 ms
    this.onSearch = debounce(this.onSearch, 200);
  }

  componentDidMount () {
    FriendStore.listen(this.onChange);
    FriendActions.getFriendsList();
  }

  componentWillUnmount() {
    FriendStore.unlisten(this.onChange);
  }

  onChange(state) {
    console.log(state);
    this.setState(state);
  }

  onSearch(event){
    this.setState({search: event.target.value});
    if (this.state.search !== '')
      FriendActions.getSearchList(this.state.search);
  }

1 ответ

Решение

Вы должны изменить свою логику. Примерно так должно работать:

onSearch(event){
  var search = event.target.value;

  if (search !== '') {
    FriendActions.getSearchList(search);
  }

  this.setState({search: search}); // w/ ES6: this.setState({search});
}

Вы правы в том, что setState не сразу. Причина в том, что вы можете иметь много setState звонки в вашем коде. Реакт будет работать render на setState, По причинам производительности он ждет пока все setState Звонки сделаны, затем оказывает.

Альтернативное решение (не рекомендуется): установите свое состояние вручную

this.state = 'whatever';

и обновить себя

this.forceUpdate();
Другие вопросы по тегам