Превышена максимальная глубина обновления при подсчете значений массива в состоянии

я пытаюсь подсчитать значение из 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>

что я должен сделать, чтобы это работало

это вызывает проблему this.checkIFvat(obj.vatValue)

Junius L. 13.05.2019 20:44

Вы не должны итеративно устанавливать состояние из части рендеринга жизненного цикла реакции, как вы можете видеть по своей ошибке. Объедините это в функцию суммирования, которая устанавливает состояние один раз после сопоставления инвойсаDetails.

Sterling Archer 13.05.2019 20:45

спасибо @SterlingArcher

isso kd 13.05.2019 20:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы вызываете 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>
      </>
    );
  }

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