Обратный вызов React setState перед рендерингом

#reactjs

#reactjs

Вопрос:

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

 checkWin() {
        if (cards[Object.keys(cards)[12]].number === 0) {
            alert("GAME OVER");
        }
    }

    drawCard() {
        let cardNumber;
        do {
            cardNumber = Math.floor(Math.random() * (Object.keys(cards).length));
        }
        while (cards[Object.keys(cards)[cardNumber]].number === 0);
        var card = cards[Object.keys(cards)[cardNumber]];
        card.number = card.number - 1;
        console.log()
        this.setState({
            card: card.images[card.number   1],
            total: this.state.total -1,
            description: card.description
        }, this.checkWin());
    }

  

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

редактировать: предупреждение появляется перед отображением новой карты

он работает по назначению, изменив checkWin() на это:

         if (cards[Object.keys(cards)[12]].number === 0) {
            setTimeout(function(){
                alert("GAME OVER");
            }, 500);
        }
  

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

1. что вы подразумеваете под «до того, как произойдет рендеринг»?

2. предупреждение появляется перед изменением экрана, чтобы показать новую карту, которая изменяется в setState

3. Вы вызываете функцию во время выполнения. Измените его на this в обратном вызове: }, () => this.checkWin());

Ответ №1:

вы неправильно выполняете функцию обратного вызова. попробуйте это

         this.setState({
            card: card.images[card.number   1],
            total: this.state.total -1,
            description: card.description
        }, () => this.checkWin() );   ///-> see here
  

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

1. Уже пробовал это, он все равно появляется перед рендерингом

2. рендеринг занимает некоторое время. вы можете отложить всплывающее окно на 100 мс