Кнопки «Далее» и «Предыдущий» не работают должным образом

Я создаю приложение для реагирования, которое отображает различные компоненты сети при нажатии кнопок «Далее» и «Назад». Проблема, с которой я столкнулся, заключается в том, что обе эти кнопки реагируют на предыдущее нажатие кнопки. Типа если сначала нажать дальше то ничего не произойдет. Если затем я нажму назад, то он реагирует на предыдущее нажатие кнопки следующего.

class Card extends Component {
  constructor()
  {
    super();
    this.state = {
      button:"", 
      i:0
    }
  }
  onClick = (event)=>{
    this.setState({button: event.target.id})
    if (this.state.button== = "1")
    {
      this.setState({ i: this.state.i + 1 });
    }
    else if (this.state.button== = "2")
    {
     this.setState({ i: this.state.i - 1 });
    }
   console.info(this.state.i)
  }
  render() {
    return(
      <div className = "App">
      <div >
      <NavBar onButtonClick = {this.onClick}/>
      <CardList  i = {this.state.i} />
      </div> 
      </div>
 );
  }
}

export default Card;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
281
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

this.setState требуется немного времени, чтобы обновить все состояние, поэтому вы не можете надежно выполнить this.setState({button: event.target.id}), а затем сразу после этого проверить this.state.button — вероятно, состояние еще не закончилось.

Вместо этого я бы рекомендовал установить условное выражение на основе event.target.id, например:

if (event.target.id === "1") {
  this.setState({ i: this.state.i + 1 });
} else if (event.target.id === "2") {
  this.setState({ i: this.state.i - 1 });
}

Я бы подождал, пока верхняя часть вашего render метода console.info вашего состояния для целей отладки, так как к тому времени он будет обновлен.

Для получения дополнительной информации о том, как правильно использовать setState, вы можете увидеть этот статья, особенно раздел, озаглавленный «Обновления состояния могут быть асинхронными».

setState в React пакетируется React, по сути это означает, что если вы делаете 3 вызова set state один за другим, все они вызываются последовательно.

Я рекомендую прочитать официальные документы для более подробной информации.

Теперь о вашей проблеме: вы устанавливаете состояние на основе «предыдущего значения» в этом состоянии:

this.setState({ i: this.state.i - 1 });

Это приведет к «неожиданному» поведению из-за пакетного режима, поскольку this.state.i мог измениться во время его фактического вызова.

Вот что рекомендуют делать документы React:

setState() does not always immediately update the component. It may batch or defer the update until later. This makes reading this.state right after calling setState() a potential pitfall. Instead, use componentDidUpdate or a setState callback (setState(updater, callback))

Существует вторая сигнатура для метода setState, который принимает функция с сигнатурой: (state, props) => stateChange, где props является необязательным, если вы не хотите его использовать, не нужно его передавать.

Распространенная ошибка, которую вы, кажется, делаете, это чтение this.state после звонка this.setState, это не сработает.

Приведенный ниже код не идеален, но, надеюсь, показывает, что вам нужно исправить.

onClick = (event)=>{
    var buttonId = event.target.id;
    if (buttonId== = "1")
    {
      this.setState((state) => {
        return { i: state.i + 1, button: 1 }
      });
    }
    else if (buttonId== = "2")
    {
     this.setState((state) => {
        return { i: state.i - 1, button: 2 }
      });
    }
  }

Дополнительное чтение: Если вам все еще нужно понять, как использовать функции в setState, могу порекомендовать эту статью: https://medium.freecodecamp.org/functional-setstate-is-the-future-of-react-374f30401b6b

Другие вопросы по теме