reactjs - 即使在 useEffect 挂钩中,React setState 也不会更新状态?
问题描述
所以我正在制作一个每秒更新的工资计数器。我在 useEffect 挂钩中设置了一个 setInterval 计时器,以使用 setState 更新我的“currentSalary”,“currentSalary”的值一直在更新,但是当我记录该值时,它始终为 0。我无法解决这个问题. 以前从未有过设置状态的问题。
关于我做错了什么的任何想法?
function App() {
//State
const [date, setDate] = useState();
const [salaryPerHour] = useState(145);
const [salaryPerSecond] = useState(salaryPerHour / 60 / 60);
const initialSalary = 0;
const [currentSalary, setCurrentSalary] = useState(initialSalary);
useEffect(() => {
console.log("Use effect att App.js");
if (!date) {
setInterval(function() {
updateDate();
setCurrentSalary(prevCurrentSalary => prevCurrentSalary + salaryPerSecond);
console.log(currentSalary);
}, 1000);
}
});
解决方案
currentSalary
是一个本地常量。它永远不会改变,这不是我们setCurrentSalary
想要做的。相反,调用的目的setCurrentSalary
是告诉 react 重新渲染组件。在下一次渲染中,将创建一个新的局部变量,并将获得新的值。但是之前渲染的日志语句看不到这一点。
所以它正在更新值,您只需将日志语句放在无用的地方。如果您想验证组件是否使用新值重新渲染,请将您的日志语句放在组件的主体中。
const [currentSalary, setCurrentSalary] = useState(initialSalary);
console.log('rendering with', currentSalary);
useEffect(() => {
// ...
推荐阅读
- pyspark - 调用 o50.load 时发生 Pyspark 错误。: com.mysql.cj.jdbc.exceptions.CommunicationsException: 通信链路故障
- python - 解码来自 ATM90E32AS 电能表 IC 的接收数据
- linux - 我们可以在 WSL 架构中设置 DWM WM 吗?
- python - 按相似度对单词进行分组
- rxjs - rxjs为什么用next()触发管道时行为会受到影响
- php - 如何根据表单数据更新数据库
- java - 二进制 XML 文件第 26 行:RecyclerView 没有 LayoutManager androidx.recyclerview.widget.RecyclerView{a9ab2d5 VFED
- powershell - 使用 Powershell 从设备和打印机中删除打印机
- c - 冒泡排序未正确排序
- flutter - 当文本字段与以前相同时,如何发送消息?