处理功能组件中的过时状态
Handling out of date state in functional components
我 运行 遇到设置状态的问题,该状态是在异步函数中使用 'useState' 挂钩创建的。
我创建了一个代码笔来演示:https://codepen.io/james-ohalloran/pen/ZdNwWQ
const Counter = () => {
const [count, setCount] = useState(0);
const increase = () => {
setTimeout(() => {
setCount(count + 1);
},1000);
}
const decrease = () => {
setTimeout(() => {
setCount(count - 1);
},1000)
};
return (
<div className="wrapper">
<button onClick={decrease}>-</button>
<span className="count">{count}</span>
<button onClick={increase}>+</button>
</div>
);
};
在上面的示例中,如果您单击 'increase',然后单击 'decrease'..您将以 -1 结束(我希望它是 0)。
如果这是一个 React class 而不是功能组件,我认为解决方案是在函数上使用 bind(this)
,但我没想到这会成为箭头函数的问题。
因为使用了setTimeout
假设您在一秒钟内调用了 increase()
10 次。
count
将永远是 0
。因为状态在一秒后更新,所以在一秒内调用的每个 increment()
都会有一个未更新的 count
.
所以每个 increment()
都会调用 setCount(0 + 1);
。
所以不管你一秒钟调用多少次,count
总是1
。
啊,我找到了解决办法。我没有意识到我可以从 useState setter 函数中引用 previousState:https://reactjs.org/docs/hooks-reference.html#functional-updates
我 运行 遇到设置状态的问题,该状态是在异步函数中使用 'useState' 挂钩创建的。
我创建了一个代码笔来演示:https://codepen.io/james-ohalloran/pen/ZdNwWQ
const Counter = () => {
const [count, setCount] = useState(0);
const increase = () => {
setTimeout(() => {
setCount(count + 1);
},1000);
}
const decrease = () => {
setTimeout(() => {
setCount(count - 1);
},1000)
};
return (
<div className="wrapper">
<button onClick={decrease}>-</button>
<span className="count">{count}</span>
<button onClick={increase}>+</button>
</div>
);
};
在上面的示例中,如果您单击 'increase',然后单击 'decrease'..您将以 -1 结束(我希望它是 0)。
如果这是一个 React class 而不是功能组件,我认为解决方案是在函数上使用 bind(this)
,但我没想到这会成为箭头函数的问题。
因为使用了setTimeout
假设您在一秒钟内调用了 increase()
10 次。
count
将永远是 0
。因为状态在一秒后更新,所以在一秒内调用的每个 increment()
都会有一个未更新的 count
.
所以每个 increment()
都会调用 setCount(0 + 1);
。
所以不管你一秒钟调用多少次,count
总是1
。
啊,我找到了解决办法。我没有意识到我可以从 useState setter 函数中引用 previousState:https://reactjs.org/docs/hooks-reference.html#functional-updates