我在从异步函数中设置使用'useState'钩子创建的状态时遇到问题。
我创建了一个代码笔来演示:https://codepen.io/james-ohalloran/pen/ZdNwWQ
bind(this)
在上面的示例中,如果单击“增加”,然后单击“减少”,您将得到-1(我希望它为0)。
如果这是React类而不是功能组件,那么我认为解决方案是在函数上使用validateEmail({ nativeEvent: { key } }) {
if (key == "Enter") return;
let value = (this.state.email || "");
if (key == "Backspace") {
value = value.substring(0, Math.max(0, value.length - 1));
}
else {
value = value.concat(key.replace(/[^a-z0-9.+@_-]+/ig, "").toLowerCase());
}
this.setState({ email: value});
}
...
const Email = <Input
value={this.state.email}
onKeyPress={this.validateEmail}
/>
,但我不希望这会成为箭头函数的问题。
答案 0 :(得分:0)
这是因为使用了setTimeout
让我们假设您在一秒钟内打电话给increase()
10次。
count
将始终为0
。因为状态是在一秒钟后更新的,所以每秒钟调用的increment()
将具有未更新的count
。
因此每个increment()
都会呼叫setCount(0 + 1);
。
因此,无论您在一秒钟内呼叫多少次,count
始终是1
。
答案 1 :(得分:0)
啊,我找到了解决方案。我没有意识到我能够从useState setter函数中引用previousState:https://reactjs.org/docs/hooks-reference.html#functional-updates