Реакция setState, кажется, отменена излишней отправкой? - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь включить кнопку отправки, когда я нажимаю флажок и редактирую этот существующий компонент, чтобы использовать избыточность (я понимаю, что это не здорово, я просто пытаюсь заставить работать одну часть перед рефакторингом). На данный момент кнопки нет на странице.

class Survey extends Component {
  state = {
    questionsList: [
      {
        key: 'q1',
        checked: this.props.survey && this.props.survey.includes('q1'),
      },
      {
        key: 'q2',
        checked: this.props.survey && this.props.survey.includes('q2'),
      }
    ],
  };

  handleChange = (e) => {
    const questions = JSON.parse(JSON.stringify(this.state.questionsList));

    // Filter the question for the checkbox user interacted with.
    const question = questions.find(q => q.key === e.target.name);
    question.checked = !question.checked; // toggle

   this.props.setEnableSubmit(questions.some(q => q.checked)); // dispatches a redux action (defined in mapDispatchToProps)
   this.setState({ questionsList: questions });
  }

  render() {
    return this.state.questionsList.map(question => (
      <Checkbox name={question.key} onChange={this.handleChange} />
    ));
  }
}

const mapStateToProps = (state, ownProps) => ({
  survey: state.users[ownProps.match.params.userTarget].survey,
});

const mapDispatchToProps = (dispatch, ownProps) => ({
  setEnableSubmit: (value) => {
    dispatch(update(ownProps.match.params.userTarget, { enableSubmit: value }));
  }
});

export default compose(
  withRouter,
  connect(
    mapStateToProps,
    mapDispatchToProps,
  ),
)(Survey);


Я пытаюсь сохранить отключенную / включенную кнопку в магазине, сохраняя все изменения в локальном состоянии (и сохраняя только в хранилище редуксов по нажатию кнопки)

по какой-либо причине, когда enableSubmit происходит, при повторном рендеринге fn this.state.questionsList больше не имеет обновленного questionsList (поэтому я не могу установить флажки ). Однако это работает, если я удалю диспетчерский вызов. Он имеет такое же поведение, если setState не существует.

Он попадает в setState без исключения. Он обновляет enableSubmit в хранилище с переданным значением. Кажется, не имеет значения, какая строка вызывается первой или последней, или если в cb отправке или отправке находится cb to setState (пробовал все варианты)

1 Ответ

0 голосов
/ 07 марта 2020

Я обнаружил, что проблема связана с компонентом, отображающим этот дочерний компонент. У родительского компонента было mapStatetoProps, которое следило за фрагментом хранилища редуксов, которое обновлялось всякий раз, когда я вызывал enableSubmit, поэтому родительский компонент получал новые реквизиты, переопределял и, следовательно, создавал новый экземпляр дочернего компонента на основе нашей настройки. Таким образом, множественные вызовы mapDispatchToProps и кажущееся игнорирование setState были вызваны созданием нового дочернего компонента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...