在等待之后调用 setState 时,状态立即可用

Posted

技术标签:

【中文标题】在等待之后调用 setState 时,状态立即可用【英文标题】:state is immediately available when setState is called after await 【发布时间】:2019-09-03 04:47:33 【问题描述】:

在等待另一个函数并将状态记录到控制台后调用 setState - 值立即可用。

我知道 setState 是异步的,在所有其他情况下,它不会在调用后立即可用(但会在 setState 回调中可用)

当不使用 await 时(预期)

// inital value state is 0
const response = fetchSomething()
this.setState(
  value: 5
)

console.log(this.state.value) // prints 0

与等待一起使用

// inital value state is 0
const response = await fetchSomething()
this.setState(
  value: 5
)

console.log(this.state.value) // prints 5

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

当你创建一个函数 async 和你 await 某个表达式时,以下语句将在等待的承诺得到解决后运行。

文档声明setState() does not always immediately update the component,但通常不会,但在这种情况下,当您在事件处理程序中解决承诺后更新状态时,状态会立即更新。

示例

class App extends React.Component 
  state = 
    value: 0
  ;

  asyncClick = () => 
    Promise.resolve().then(() => 
      this.setState(
        value: 5
      );

      console.log(this.state.value);
    );
  ;

  syncClick = () => 
    this.setState(
      value: 5
    );

    console.log(this.state.value);
  ;

  render() 
    return (
      <div>
        <div>this.state.value</div>
        <button onClick=this.asyncClick>Async click</button>
        <button onClick=this.syncClick>Sync click</button>
      </div>
    );
  


ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>

【讨论】:

这个解释得很好 更准确地说,“并不总是”取决于 setState 是在组件生命周期内部还是外部调用。更多详情,***.com/a/48610973/3731501

以上是关于在等待之后调用 setState 时,状态立即可用的主要内容,如果未能解决你的问题,请参考以下文章

此异步等待不应该工作。为啥它会起作用?

Flutter:setState 在第一次尝试时工作,但在响应 = 等待后没有工作

React中的setState

使用 setState 时如何立即获取更新状态?

即使在调用 setState 之后,React.js 子状态也不会重新渲染?

更新状态 - 为啥在调用 setState 时创建新的状态副本?