javascript - useState 钩子设置器错误地覆盖了状态
问题描述
这是问题所在:我试图在单击按钮时调用 2 个函数。这两个函数都会更新状态(我正在使用 useState 挂钩)。第一个函数将 value1 正确更新为“new 1”,但在 1s (setTimeout) 后第二个函数触发,并将 value 2 更改为“new 2”但是!它将 value1 设置回 '1'。为什么会这样?提前致谢!
import React, { useState } from "react";
const Test = () => {
const [state, setState] = useState({
value1: "1",
value2: "2"
});
const changeValue1 = () => {
setState({ ...state, value1: "new 1" });
};
const changeValue2 = () => {
setState({ ...state, value2: "new 2" });
};
return (
<>
<button
onClick={() => {
changeValue1();
setTimeout(changeValue2, 1000);
}}
>
CHANGE BOTH
</button>
<h1>{state.value1}</h1>
<h1>{state.value2}</h1>
</>
);
};
export default Test;
解决方案
欢迎来到封闭地狱。发生此问题是因为无论何时setState
调用,state
都会获取新的内存引用,但函数changeValue1
和changeValue2
,由于关闭,保留旧的初始state
引用。
确保setState
从changeValue1
和获取最新状态的解决方案changeValue2
是使用回调(将先前的状态作为参数):
import React, { useState } from "react";
const Test = () => {
const [state, setState] = useState({
value1: "1",
value2: "2"
});
const changeValue1 = () => {
setState((prevState) => ({ ...prevState, value1: "new 1" }));
};
const changeValue2 = () => {
setState((prevState) => ({ ...prevState, value2: "new 2" }));
};
// ...
};
推荐阅读
- python - 使用 InstaBot 模块将视频上传到 Instagram
- typescript - 为什么不能使用函数来断言 var 在打字稿中不为空
- node.js - 如何使用 Node.js 发出 https 发布请求(需要授权)
- c - 如何从二进制文件中计算行数以进行 C 编程
- inheritance - 在子类中启动超类对象
- powerbi - Power BI:将一列移到上一行
- javascript - 在 Carousel/Slider 上添加动画
- python - Mac OSError: [Errno -9996](无默认输出设备)
- python-3.x - 循环列并计算组内的相对变化
- python - datetime.strptime - 不接受在 Linux(Ubuntu) 上运行的缩写德语月份。有解决方法吗?