gpt4 book ai didi

javascript - useState Hook setter 错误地覆盖状态

转载 作者:行者123 更新时间:2023-12-03 13:00:15 25 4
gpt4 key购买 nike

问题是:我试图在单击按钮时调用 2 个函数。这两个函数都会更新状态(我正在使用 useState Hook )。第一个函数将 value1 正确更新为“新 1”,但 1 秒(setTimeout)后第二个函数触发,并将值 2 更改为“新 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;

最佳答案

欢迎来到闭包 hell 。发生此问题的原因是,每当调用 setState 时,state 都会获取新的内存引用,但函数 changeValue1changeValue2 ,由于关闭,保留旧的初始 state 引用。

确保 changeValue1changeValue2 中的 setState 获取最新状态的解决方案是使用 callback (将之前的状态作为参数):

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" }));
};

// ...
};

您可以找到有关此关闭问题 herehere 的更广泛讨论。

关于javascript - useState Hook setter 错误地覆盖状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58193166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com