Является ли это.состояние текущим при вызове средства обновления setState?

#reactjs

Вопрос:

Я понимаю, что полностью обновленное состояние передается в обратный вызов setState. Однако я хотел бы знать, является ли это.состояние также текущим в то время. Причина в том, что у меня есть метод, который использует это.состояние, и я хотел бы знать, безопасно ли звонить изнутри обратного вызова. Пример:

 areWeBigger = () => {
  const { theirSize } = this.props;
  const { ourSize } = this.state;

  return ourSize > theirSize;
};

attemptToEat = () => {
  this.setState(({ ourSize }) => {
    const bigger = this.areWeBigger(); // Is this safe?

    return { ourSize: bigger ? ourSize   1 : ourSize - 1 }; 
  });
};
 

Редактировать

Теперь я понимаю, что то, что я называл «обратным вызовом», на самом деле называется «обновлением». Извините за путаницу.

Комментарии:

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

2. это.areWeBigger() происходит до изменения состояния. это.setState(param1, param2), где param1 знает только текущее состояние, а param2 (обратный вызов) — обновленное.

3. Ваш пример был бы намного более читабельным и простым для усвоения, если бы вы не использовали синтаксис деструкции объектов для передачи аргументов в функцию обновления состояния.

Ответ №1:

Я думаю, это должно сработать. Синтаксис также немного отличается от того, что вы использовали. Вы не используете callback в приведенном выше примере, а скорее используете функциональное соглашение setState метода. Пожалуйста, обратитесь к документации React JS для получения дополнительной информации об этом. Кроме того, следующий фрагмент может представить лучший подход к тому, чего вы пытаетесь достичь.

 const areWeBigger = () => {
  const { theirSize } = this.props;
  const { ourSize } = this.state;
  return ourSize > theirSize;
};

const attemptToEat = () => {
  this.setState({ ourSize: "whatever value" }, () => {
    const bigger = this.areWeBigger(); // it is okay to use this
    // it doesn't return anything, that is not supported so remove your return statement
    // ideally you can also use componentDidUpdate lifecycle method if you don't want to always trigger a callback, you can refer react docs.
  })
     
  });
};
 

Ответ №2:

Похоже, в вашем случае вам не нужен обратный вызов setState.

Отсюда вы можете вызвать setState следующим образом:

 this.setState((prevState, props) => {
  return {counter: prevState.counter   props.step};
})
 

Таким образом, вы можете вызвать свою функцию areWeBigger следующим образом:

 areWeBigger = (ourSize , theirSize ) => {
  return ourSize > theirSize;
};

attemptToEat = () => {
  this.setState(({ ourSize }, {theirSize }) => { //extract ourSize and theiSize from (current)state and props respectively
    const bigger = this.areWeBigger(ourSize, theirSize ); // this is before the state is updated
    return { ourSize: bigger ? ourSize   1 : ourSize - 1 }; 
  });
};
 

Чтобы это мешало вам с прямым доступом к состоянию в «areWeBigger»:

 areWeBigger = () => {
  const {ourSize} = this.state;
  const {theirSize} = this.props;
  return ourSize > theirSize;
};

callback = () => {
  // ... here the state is up to date
}

attemptToEat = () => {
  this.setState(({ ourSize }) => { //extract ourSize and theiSize from (current)state and props respectively
    const bigger = this.areWeBigger(); // this is before the state is updated
    return { ourSize: bigger ? ourSize   1 : ourSize - 1 }; 
  }, callback); // to see the use of callback
};
 

Комментарии:

1. Извините, моя терминология была неправильной. На самом деле я имел в виду «обновление», а не «обратный вызов». Я действительно понял, что могу сделать это, как показано в вашем примере, спасибо. Однако метод areWeBigger() вызывается в нескольких местах в моем компоненте. Было бы чище, если бы к этому.состоянию можно было просто получить доступ внутри него (устраняя необходимость передавать параметры для каждого вхождения). Кажется возможным (или даже вероятным), что prevState существует только для удобства, так как вы всегда будете получать доступ к состоянию в программе обновления. Поэтому мой вопрос заключается в том, могу ли я сделать это выше, не передавая параметры в areWeBigger().