javascript - 通过将函数传递给 setCount 来修复陈旧闭包的副作用
问题描述
我有一个关于过时关闭的问题。
代码:
import React, { useState } from "react";
export default function App() {
const [flag, setFlag] = useState(false);
const [count, setCount] = useState(0);
if (!flag) {
console.log("before", count);
setCount(count => count + 2);
setCount(count => count + 3);
setCount(count => count + 1);
setFlag(true);
console.log("after", count);
}
return (
<div>
<p>Render: {flag + ""}</p>
<p>Render: {count}</p>
</div>
);
}
输出:
Render: true
Render: 6
在这里,我修复了陈旧的闭包 setCount
setCount(count => count + 2);
setCount(count => count + 3);
setCount(count => count + 1);
但是在控制台中我得到
before 0
after 0
我期望得到的地方
before 0
after 6
你能解释一下为什么控制台日志中的计数仍然是 0 吗?
现场演示: https ://codesandbox.io/s/crazy-joliot-xnmrp
谢谢!
解决方案
count
是一个常量;它不可能改变。的目的setCount
不是改变之前渲染的变量,而是指示 react 再次渲染。在下一次渲染中,将使用新值创建一个新变量。
如果您想查看新值,请将您的 console.log 放在组件的主体中,您将看到它以新值重新呈现。
推荐阅读
- python - 如何在日期之前禁用 Odoo Datepicker 中的天数?
- mysql - 在mysql中计算登录注销时间
- android - 缓慢颤动的 GridView
- string - 将`date`命令的输出读入C脚本Unix中的变量
- python - 模块“numpy”没有属性“arrange”的错误一直在该消息中
- spring - Spring Boot - 扫描包
- audio - 当数据库级别低于阈值时,FFMPEG 可以暂停实时音频录制吗?
- pandas - 组织 csv。Python中的文件数据
- python-3.x - 跟踪图像中的白色区域
- mongodb - Mongodb shell聚合查询比较日期不返回结果