javascript - 为什么在尝试显示两个状态值的平均值时会得到 NaN?
问题描述
新手来了 尝试学习 React 并且我目前正在尝试显示average=(good+bad)/all
但是,我一直得到NaN
我假设我得到的结果,因为我的状态值都是 0。我很困惑为什么这是因为在调用后setClicks(newStats)
我认为统计信息已更新。
import React, { useState } from "react"
const App = () =>{
const [stats,setClicks] = useState({good:0,neutral:0,bad:0,all:0,positive:0,average:0})
const handleGood=()=>
{
const newStats={
...stats,
all: stats.all +1,
good:stats.good +1,
average: (stats.good - stats.bad)/stats.all,
}
setClicks(newStats)
console.log("Stats.good",stats.good)
console.log("Stats.bad",newStats.bad)
console.log("Stats.all",stats.all)
}
const handleBad=()=>
{
const newStats= {
...stats,
bad: stats.bad+1,
all: stats.all+1,
average: (stats.good - stats.bad)/stats.all,
}
setClicks(newStats)
}
const handleNeutral =() =>
{
const newStats={
...stats,
neutral:stats.neutral +1,
all: stats.all+1,
average: (stats.good - stats.bad)/stats.all,
}
setClicks(newStats)
}
const Button =({handleClick,text})=>{
return(
<button onClick={handleClick}>{text}</button> )
}
return(
<div>
<h1>Give Feedback</h1>
<Button handleClick={handleGood} text="good"/>
<Button handleClick={handleNeutral} text="neutral"/>
<Button handleClick={handleBad} text="bad"/>
<br/>
<h2>Statistics</h2>
<p>good: {stats.good}</p>
<p>neutral: {stats.neutral}</p>
<p>bad: {stats.bad}</p>
<p>all:{stats.all}</p>
<p>average: {stats.average}</p>
<p>positive: {stats.positive}</p>
</div>
)
}
export default App
改变状态的最佳方法是什么?应该怎么做NaN
才不会出现?
解决方案
对于平均值的初始计算,您需要使用更新后的值:
const handleGood= () => {
const newAll = stats.all + 1;
const newGood = stats.good + 1;
const newStats={
...stats,
all: newAll ,
good:newGood ,
average: (newGood - stats.bad)/newAll,
}
setClicks(newStats);
}
推荐阅读
- heroku - Heroku云上的scrapy+splash
- javascript - 使用 peggy js 使用 JavaScript 解析表达式
- reactjs - 如何在 Next.js 应用程序中拥有不同的 env 文件?
- python - 有两个数据框,如何创建第三个
- javascript - 如何使用 Chart.js 从图表中删除底线
- javascript - Vue: Access component object inside methods
- python-3.x - 无法在 Python 中读取大型机生成的文件
- r - R:pairwise.t.test 在一个缺失值的长格式数据帧上,使用一个命令
- mysql - MySQL MAX(date) 在 LEFT JOIN ON 2 个表中
- firebase-analytics - 转化跟踪的 Firebase 配置限制(30 个转化事件)是否适用于项目级别的应用级别?