Reactjs React,setState和async updater参数?
有人知道在React中是否可以在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
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
}
}