ReactJS выбирает тег, не отражающий обновленное состояние

#reactjs #react-redux #redux-saga

#reactjs #react-redux #redux-сага

Вопрос:

у меня реализован тег выбора со значением и onChange, onChange запускает действие redux и обновляет состояние, которое используется в параметрах тега выбора (поэтому компонент обновляется по мере обновления состояния)

Я попытался обновить состояние в обычном режиме и с помощью функции обратного вызова.Это не помогает

 import React from "react";
import { connect } from "react-redux";

export class SelectDestination extends React.Component {
  constructor(props)
  {
    super(props);
    this.state={defaultval:''}
  }
  onSelectChange = event => {
    let val=event.target.value
    this.setState({defaultval:event.target.value},function(){this.props.onSelectChange(val)})


  };

  render() {


    let options = this.props.state.planets.filter((x)=>this.props.state.vistedDestinatons.indexOf(x.name)===-1);
    console.log(options)
    return (
      <React.Fragment>
        {
          <select value={this.state.defaultval} onChange={this.onSelectChange} name="onselect">
            {options.map(x => (
              <option value={x.name.toString()}>{x.name}</option>
            ))}
          </select>
        }
      </React.Fragment>
    );
  }
}

const mapStateToProps = state => {
  return {
    state: state
  };
};
const mapDispatchToProps = dispatch => {
  return {
    onSelectChange: payLoad =>
      dispatch({ type: "SELCT_CHNG", payload: payLoad })
  };
};

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(SelectDestination);
 

Я ожидаю, что это состояние должно быть отражено в теге выбора. При открытии в react-dev-tools я вижу обновление состояния.

Ответ №1:

Это связано с тем, что .setState это асинхронная функция. Подробнее об этом можно прочитать здесь . Обычно это означает, что вы должны либо приводить к обратным вызовам, либо к обещаниям.