处理功能组件中的过时状态

时间:2019-07-15 02:59:47

标签: reactjs react-16

我在从异步函数中设置使用'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} /> ,但我不希望这会成为箭头函数的问题。

2 个答案:

答案 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