2017-06-27 16 views
4

ReactでsetState(updater)で非同期アップデータパラメータを使用することができるかどうかは知りませんか?非同期のアップデータパラメータを使用して、setStateに反応しますか?

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

どうやらasyncパラメータが問題です:私は(fが呼び出されるが、UIが更新されていない)動作していない、次のコードを持っています。私はこの醜い代替バージョンを使用しなければならなかった:

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

上記のコードを書く良い方法はありますか?

答えて

0

私はあなたがメソッドに対してsetStateを呼び出すと仮定しています。それでは、メソッドに非同期を置くのはなぜですか? SETSTATEは、副作用のない純粋な関数にする必要があるので、あなたがSETSTATEの内部で非同期を使用することはできません

async handleSomething() { 
 
    //.. some logic 
 

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

+0

D-リーパーが正しいです - 'setState()'は非常に原子的な操作でなければならず、非同期操作のための悪い場所です。メソッド呼び出しに非同期フェッチを入れます。 – Omortis

+0

'await'はラムダ関数の中にあり、それも' async'である必要があります(typescriptコンパイラは私にエラーを与えます)ので、これは許されません。 –

+1

@Omortis:私は通常、 'setState'からフェッチを移動します。問題は、以前の' setState'呼び出しがあるためです。フェッチのために 'this.state'を参照することはできません。私は状態にアクセスするために 'setState(func)'を使わなければなりません。 –

-1

。ただ、SETSTATE呼び出しの前に非同期メソッドを実行します。

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

'this.state.someData'を使用することはできません。私の' classMethod'では 'this.state'を信頼できないようにする前の' setState'呼び出しがあるからです。 –

1

次に、あなたが二回setStateことができます。

関連する問題