Сильный кошмар, пытающийся вычислить сумму массива (чисел) в ReactJS / State.
Код, который я разместил ниже, работает, если я не использую состояние.
Когда я смотрю на консоль, оба состояния хранят массив чисел. И собирать каждую запись в массив нормально.
Я хочу найти и распечатать сумму этих чисел. Итак, я использую:
// FUNCTION TO CALCULATE TOTAL DONATIONS
const numbers = this.state.sum;
function add(a, b) {
return a + b;
}
// // TOTAL VALUE OF NUMBERS IN THE ARRAY
const cal = numbers.reduce(add, 0);
console.info('CALC', cal);
Однако проблема, с которой я столкнулся, заключается в том, что я отправляю, например, число 20. Функция суммы, консоль сначала регистрирует 0. Когда я ввожу второй номер, консоль регистрирует первое введенное мной число ...
Что я делаю неправильно? Вот мой полный / соответствующий код:
class App extends React.Component {
constructor() {
super();
this.state = {
number: '',
donated: [],
sum: [],
total: 0
};
this.handleChangeEvent = this.handleChangeEvent.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
// we need to bind otherwise this is undefined
}
//HANDLE FUNCTIONS
handleChangeEvent(e) {
this.setState({ number: e.target.value }, () =>
console.info('NUMBER', this.state.number));
}
handleSubmit(e) {
e.preventDefault();
this.setState({donated: this.state.donated.concat(this.state.number).map(Number)}, () => console.info('DONATED', this.state.donated));
this.setState({sum: this.state.donated.concat(this.state.number).map(Number)}, () => console.info('SUM', this.state.sum));
// FUNCTION TO CALCULATE TOTAL DONATIONS
const numbers = this.state.sum;
function add(a, b) {
return a + b;
}
// TOTAL VALUE OF NUMBERS IN THE ARRAY
const cal = numbers.reduce(add, 0);
console.info('CALC', cal);
document.forms['id_form'].reset();
}
render() {
return (
<main>
<section className = "section">
<h1 className = "is-size-2">DONATE FOR A GOOD CAUSE</h1>
<ProgressBar donated = {this.state.donated} sum = {this.state.sum}/>
<Form donated = {this.state.donated} handleChangeEvent = {this.handleChangeEvent} handleSubmit = {this.handleSubmit} />
</section>
</main>
);
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
вы можете использовать этот шаблон, чтобы поделиться своим рабочим примером codepen.io/anon/pen/ERYXYg
Обновите свой вопрос, добавив минимальный воспроизводимый пример, демонстрирующий проблему, в идеале работоспособный, используя Stack Snippets (кнопка панели инструментов [<>]). Фрагменты стека поддерживают React, включая JSX; вот как это сделать.
Я действительно не могу этого сделать? Я использовал несколько компонентов? Я не думаю, что смогу перестроить все приложение, используя эту ссылку ... Мне пришлось бы изменить свой код ...
Я обнаружил вашу проблему, setState - это асинхронная функция, она не меняет состояние сразу после ее вызова, и вы используете состояние сразу после вызова состояния набора, которое все еще содержит старые значения



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


По официальному документация
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)), either of which are guaranteed to fire after the update has been applied. If you need to set the state based on the previous state, read about the updater argument below.
Используйте setState callBack для вычисления суммы, чтобы получить обновленные значения
this.setState({sum: this.state.donated.concat(this.state.number).map(Number)}, () => {
console.info('SUM', this.state.sum);
// FUNCTION TO CALCULATE TOTAL DONATIONS
const numbers = this.state.sum;
function add(a, b) {
return a + b;
}
// TOTAL VALUE OF NUMBERS IN THE ARRAY
const cal = numbers.reduce(add, 0);
console.info('CALC', cal);
document.forms['id_form'].reset();
});
или вы можете просто обновлять переменную суммы после каждой отправки нового значения. как это
setState({sum: this.state.sum + this.state.number, number: 0});
хорошо, спасибо, как лучше всего структурировать это в моем коде?
УДИВИТЕЛЬНЫЙ!!!!!! СПАСИБО ВАМ БОЛЬШОЕ!!!! Очень признателен за вашу помощь! Я знал, что это как-то связано с заказом. Оцените передачу знаний. И узнал что-то новое сегодня. Спасибо! : D
Пожалуйста, поделитесь полным кодом