Почему не обновляется состояние?

У меня есть функция, которая обновляет состояние с изменением и добавляет значение, но состояние в функции addResponse не всегда меняется:

handleSelected (e, item) {
    this.setState({
        current_component_id: item.id,
    }, () => this.addResponse()
    );
};

Функция вызова выше:

addResponse (e) {
    const { enrollment_id, evaluation_id, user_id, question_id, current_component_id, 
    responses, current_question, current_question_id 
    } = this.state;
    console.info(current_component_id)

    if (current_component_id != 0) {

        const newResponse = {
            enrollment_id: enrollment_id,
            evaluation_id: evaluation_id,
            user_id: user_id,
            question_id: current_question_id,
            answer_component: current_component_id,
        };

        function hasAnswer(res) {
            const list_question_id = res.map((item) => {
                return item.question_id
            });
            if (list_question_id.includes(current_question_id)) {
                return true
            } else {
                return false
            }
        }

        if (responses === undefined) {
            this.setState({
                responses: [newResponse]
            } 
            , () => console.info('---------> primeiro', this.state.responses)
            )
        } else {
            const check = hasAnswer(responses);
            if (check) {
                this.setState(prevState => {
                    prevState.responses.map((item, j) => {
                        if (item.question_id === current_question_id) {
                            return item.answer_component = current_component_id
                        }
                        return item ;
                    })
                }
                , () => { console.info('----> questao alterada ', this.state.responses)}
                )

            } else {
                this.setState({
                    responses: [...this.state.responses, newResponse]
                    }
                    , () => console.info('------> questao nova', this.state.responses)
                    );
            }
        }
    }

    // this.nextQuestion();
};

первый console.info всегда правильный, но остальные не всегда меняются, я знаю, что setState асинхронный, но я думал, что при вызове функции addResponse он будет асинхронным

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

Ответы 1

Есть проблема в том, как вы называете setState, когда check истинен.

Должен быть

this.setState(prevState => ({
  responses: prevState.responses.map((item, j) => {
               if (item.question_id === current_question_id) {
                 item.answer_component = current_component_id
               }
               return item ;
             })
})
, () => { console.info('----> questao alterada ', this.state.responses)}
)

это пошло не так, изменил мой массив «ответов» на число current_question_id

Hiago Bonamelli 11.02.2019 01:16

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