Проблема здесь в том, что во время инициализации все ваши значения состояния равны 0
, поэтому, когда вы делаете (good-bad)/(good + neutral + bad)
в первый раз, оно оценивается как 0/0
, а деление на 0
возвращает NaN
.
Также обратите внимание, что в случае таких счетчиков, если вам нужно увеличить текущее состояние, лучше использовать функциональную форму setState
, так как она всегда будет получать самое последнее значение состояния:
const handleGood = () => {
setGood(currentGood => currentGood + 1)
}
Один из способов исправить это - проверить, делите ли вы методы 0
и вернуть по умолчанию 0
:
const formatValue = (val) => (val * 100).toFixed(1);
// Return array of values, where 1st item is average and second is positive
const getValues = () => {
const divider = good + neutral + bad;
if (divider === 0) {
return ['0', '0'];
}
return [formatValue((good - bad) / divider), formatValue(good / divider)]
}
Использование с Разрушение массива :
const [avg, positive] = getValues();