Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React,setState和async updater参数?_Reactjs_Typescript_Asynchronous_Setstate - Fatal编程技术网

Reactjs React,setState和async updater参数?

Reactjs React,setState和async updater参数?,reactjs,typescript,asynchronous,setstate,Reactjs,Typescript,Asynchronous,Setstate,有人知道在React中是否可以在setState(updater)中使用异步更新程序参数吗?我有以下代码不工作(f已调用,但UI未更新): 显然,async参数是个问题。我不得不使用这个丑陋的替代版本: this.setState( async (prevState) => { this.setState({ foo: await f(prevState.someData) }) }) 有没有更好的方法来编写上述代码?我假设您正在对一个方法调用setS

有人知道在React中是否可以在
setState(updater)
中使用异步更新程序参数吗?我有以下代码不工作(
f
已调用,但UI未更新):

显然,
async
参数是个问题。我不得不使用这个丑陋的替代版本:

this.setState( async (prevState) => {
   this.setState({
      foo: await f(prevState.someData)
   })      
})

有没有更好的方法来编写上述代码?

我假设您正在对一个方法调用setState。那么,为什么不在该方法上设置async呢

异步handleSomething(){
//…一些逻辑
this.setState(prevState=>({
foo:wait f(prevState.someData)
}))

}
您不能在setState内部使用async,因为setState需要是一个没有副作用的纯函数。只需在setState调用之前执行async方法:

async classMethod = () => {
    let response = await someAsyncOperation(this.state.someData);
    this.setState({ someData: response });
}

然后您可以设置状态两次

this.setState((prevState) => {
    f(prevState.someData);        

    // Don't change state now.
    return {}; 
})

async f(someData) {
  this.setState(prevState) {
    // Do something
  }
} 

D-reaper是对的-
setState()
应该是一个原子操作,对于异步操作来说是一个不好的地方。将异步回迁放在方法调用中。这是不允许的,因为
await
在lambda函数中,并且也需要
async
(typescript编译器给我一个错误)。@Omortis:我通常会将回迁移出
setState
,这里的问题是我以前有一个
setState
调用,因此,我无法引用
这个.state
来获取信息;我必须使用
setState(func)
才能访问状态。我不能使用
this.state.someData
,因为在我的
classMethod
中,我以前有一个
setState
调用,这使得
这个.state
不可靠。
this.setState((prevState) => {
    f(prevState.someData);        

    // Don't change state now.
    return {}; 
})

async f(someData) {
  this.setState(prevState) {
    // Do something
  }
}