я пытаюсь подсчитать значение из state.map
checkIFvat(value){
if (value > 0) {
this.setState({totalVat: this.state.totalVat + value});
return ("*")
}
}
{this.state.invoiceDetails.map(obj => {
return (
<tr>
<td>
{obj.quantity * obj.salePrice} {this.checkIFvat(obj.vatValue)}
</td>
</tr>
);
})}
<p>Vat 11%{this.state.totalVat}</p>
что я должен сделать, чтобы это работало
Вы не должны итеративно устанавливать состояние из части рендеринга жизненного цикла реакции, как вы можете видеть по своей ошибке. Объедините это в функцию суммирования, которая устанавливает состояние один раз после сопоставления инвойсаDetails.
спасибо @SterlingArcher



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


Вы вызываете this.checkIFvat() (то есть вызывает this.setState) внутри метода рендеринга, поэтому в результате вы получаете максимальную проблему с обновлением.
this.checkIFvat(obj.vatValue) вызывает эту ошибку, так как вы устанавливаете состояние в рендере. Создайте функцию для расчета НДС, где вы установите invoiceDetails.
calculateTotalVat = (items) => {
if (!items) {
return 0;
}
let totalVat = 0;
items.forEach(obj => {
totalVat += obj.vatValue;
});
return totalVat;
}
this.setState({
invoiceDetails: data,
totalVat: this.calculateTotalVat(data),
});
Затем на карте проверьте, отображается ли obj.vatValue > 0* или пустая строка.
{this.state.invoiceDetails.map(obj => {
return (
<tr>
<td>
{obj.quantity * obj.salePrice} {obj.vatValue > 0 ? '*' : ''})}
</td>
</tr>
);
})}
Если вам не нужно хранить общую стоимость чана в качестве состояния компонента, вы можете использовать следующее решение:
render() {
const { invoiceDetails } = this.state;
const totalVat = invoiceDetails.reduce((acc, invoiceDetail) => {
return acc + invoiceDetail.vatValue;
}, 0);
const rows = invoiceDetails.map(obj => {
return (
<tr>
<td>
{obj.quantity * obj.salePrice} {obj.vatValue > 0 && "*"}
</td>
</tr>
);
});
return (
<>
{rows}
<p>Vat 11%{totalVat}</p>
</>
);
}
это вызывает проблему
this.checkIFvat(obj.vatValue)