Почему setState выводит значение конечного состояния только в функциональном состоянии setState?

#reactjs

Вопрос:

 import React from 'react';

class Add extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            count: 0
        };
    }

    componentDidMount() {
        console.log('componentDidMount called');
    }

    componentDidUpdate(prevProps, prevState) {
        console.log('componentDidUpdate called');
    }

    increment() {

        this.setState(prevState => ({
            count: prevState.count   1
        }), () => {
            console.log('callback '   this.state.count)
        });

        console.log('not a callback '   this.state.count);
    }

    incrementFive() {
        this.increment();
        this.increment();
    }

    render() {
        console.log('render called');
        return (
            <div>
                <h2>count is {this.state.count}.</h2>
                <button onClick={() => this.incrementFive()}>Increment</button>
            </div>
        );
    }
}

export default Add;
 

нажмите Increment кнопку. журналы консоли:

 not a callback. count: 0
not a callback. count: 0
render called
componentDidUpdate called
callback. count: 2  //why is it 2 here instead of 1
callback. count: 2
 

Я ожидал:

 not a callback. count: 0
not a callback. count: 0
render called
componentDidUpdate called
callback. count: 1 
callback. count: 2 
 

Я понимаю setState , что ведет себя асинхронно, но я не мог понять, почему setState в обратном вызове выводится только значение конечного состояния. Если мы предоставляем обратный вызов, он выполняется сразу после обновления состояния. Здесь, когда мы нажимаем Increment кнопку , count значение равно 1, и обратный вызов должен был быть распечатан count: 1 , но я вижу, что он печатает только значение конечного состояния, т. Е. 2

Ответ №1:

setState выводит только конечное состояние, потому что вы не ждете асинхронного вызова setState , проверьте код ниже, который я использовал в режиме асинхронного ожидания

 async incrementFive() {
   await this.increment();
   await this.increment();
}
 

Теперь он выведет оба значения