为什么 React 中没有异步 getState 函数?
文档告诉我们 setState 是异步的。很好,但这意味着 我们不能安全地使用 this.state 并且我们还需要一个异步 getState 来尊重执行顺序。
据我了解,我们永远不应该使用 this.state 并使用这样的 getState 函数:
getState(callback) {
this.setState((prevState) => {
callback(prevState) ;
});
}
...
this.getState((curState) => {
// we now can use the current state safely
}
我的思维方式在这里遗漏了什么?为什么 React 中不存在这样的功能?
- 编辑 -
正如我的一个朋友告诉我的那样,这并不清楚,因为我不相信但第一个答案,让我们分析一些代码:
simpleFunc() {
setState({ "counter" : 1 });
setState({ "counter" : 2 });
this.state.counter // => no garanty about the value
getState((curState) => { // ensure curState.counter is 2 });
}
这个简单的例子表明 我们不能在所有情况下都直接使用 this.state, 因为 setState 是异步的。
这是一个可以使用 getState 的反例: http ://codepen.io/Epithor/pen/ZLavWR?editors=0010#0
简短的回答: 不好的做法,甚至不确定 getState 给我们当前
解决方法很简单,但是我们可以分解一些函数并在不关心上下文的情况下使用它们这一事实似乎很有趣,不是吗?
因此,当许多事件以特定顺序发生时,一些事件会更改状态,一些会读取状态:您如何确定,当一个事件读取状态时,使用 this.state 读取良好状态,因为所有更改都是异步的?
事实上,一切都是关于时间的:
T : event 1, change state
T+1ms : event 2, change state
T+2ms : event 3, read state
T+3ms : event 4, change state
由于您无法预测事件 1 或 2 的 setState 究竟何时会发生, 您如何保证事件 3 将真正读取事件 2 中设置的状态?
简短的回答: 事件在 JS 堆栈中排队,而状态更改在内部 React 队列中排队。在伸出手之前,内部 React 队列已完全取消堆叠。
原文由 user2668735 发布,翻译遵循 CC BY-SA 4.0 许可协议
一般来说, 您绝对可以直接使用
this.state
。你不应该直接 改变 状态(this.state.foo = 0
),而是在你想改变状态时使用setState
。通常一个
setState
看起来像这样:然后您可以安全地使用
this.state.foo
例如在您的render()
函数中。但是有一点需要注意,由于
setState
的异步性质,您无法保证在this.state
setState
.最好做
或者使用
setState
函数的第二个参数,用作 setState 操作完成时执行的回调。在该回调中,您将可以访问更新的状态,即this.state
:见: https ://facebook.github.io/react/docs/react-component.html#setstate