Причина неожиданного поведения заключается в том, что this.setState () является асинхронным и не выполняется немедленно, как ожидается.В этом случае, когда setState () вызывается один за другим, не гарантируется, что первый setState () выполняется раньше следующего.Кроме того, реагирует на попытки объединить максимально возможные вызовы setState () в один за счет уменьшения повторного рендеринга виртуального DOM и поиска изменений.
Итак, в этом случае, когда мы хотим, чтобы операции были синхронными, мы можем передать обратный вызов, который будет выполнен после успешного выполнения setState ().
generateReport(){
const { selectedOption } = this.state;
if(selectedOption && selectedOption.length > 0) {
let groups = []
selectedOption.map((item) => {
groups.push(item.value);
})
this.setState(currStaleState => ({
statusMsg: "", loaderInitialStatus:"Processing...",
condition: [...currStaleState.condition, { name: "readByGroup", operator: "IN ", value: groups }]
}), () => {
this.props.getMetricsByContent(this.state.condition).then((data) => {
this.setState({isLoader: false});
if(data && Array.isArray(data) && data.length > 0){
let csvContent = papa.unparse(data);
this.download(csvContent, 'metrics.csv', 'text/csv;encoding:utf-8');
this.setState({statusMsg: "File Downloaded successfully"})
} else this.setState({statusMsg: "No records to download"})
})
})
} else {
console.log('error : no option selected');
}
}
Кроме того, я объединилвсе вызовы setState (), которые выглядели независимыми.Также у вас должно быть условие else, если ничего не выбрано, на случай, если оно не обработано.потому что ваше состояние будет установлено на обработку навсегда, как это было установлено в первой строке ранее.
Надеюсь, это решит проблему.Пожалуйста, прокомментируйте в случае каких-либо проблем:)