[解決済み] ReactのsetState/getStateと非同期について
質問
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にそのような機能がないのか?
-- EDIT --
私の友人はそれが明確ではなかったと私に言ったように、私は最初の答えが納得できないので、いくつかのコードの部分を分析しましょう。
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のキューは手を出す前に完全にアンスタックされる。
解決方法は?
を使用すれば間違いありません。
this.state
直接
一般的に
. 決して
ミューテート
状態を直接 (
this.state.foo = 0
を使用し、代わりに
setState
は、状態を変化させたいときに使用します。
通常は
setState
はこのようになります。
this.setState({
foo: 0
})
そうすると、安全に
this.state.foo
例えば
render()
関数を使用します。
しかし、注意点があります。
setState
にすぐにアクセスできる保証はありません。
this.state
後
setState
が呼び出されました。
myFunc(baz) {
this.setState({
foo: baz + 1
})
console.log(this.state.foo) // not guaranteed
}
した方が良い
myFunc(baz) {
const bazOne = baz + 1
this.setState({
foo: bazOne
})
console.log(bazOne)
}
または
setState
関数の2番目のパラメータで、setState操作の終了時に実行されるコールバックとして使用されます。このコールバックでは、更新された状態にアクセスできる。
this.state
:
myFunc(baz) {
this.setState({ foo: baz + 1 }, () => {
console.log(this.state.foo) // guaranteed in callback
});
}
ご覧ください。 https://facebook.github.io/react/docs/react-component.html#setstate
関連
-
[解決済み] SVGサークル内の画像にボーダーを追加する方法
-
React はエラー TypeError を報告します。未定義のプロパティ 'XX' を読み取ることができない、問題は解決されました。
-
[解決済み] componentWillReceivePropsライフサイクルメソッドはいつ使用するのですか?
-
[解決済み] create-react-appビルドスクリプトを実行する際に、ビルド.env変数を設定するには?
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] React JSX内のループ
-
[解決済み] Reactのこの3つの点は何をするところなのでしょうか?
-
[解決済み] どうすればjQueryに非同期ではなく、同期のAjaxリクエストを実行させることができますか?
-
[解決済み] React NativeとReactの違いは何ですか?
-
[解決済み] setStateを呼び出さずにReactコンポーネントを強制的に再レンダリングすることは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Typescript react - モジュール ''react-materialize'' の宣言ファイルが見つかりませんでした。'path/to/module-name.js' は暗黙のうちに any 型を持ちます。
-
[解決済み] react-router-domを使用する際に「Function components cannot be given refs」を回避するにはどうすればよいですか?
-
[解決済み] useStateプロパティのフックにmap関数を使用する方法
-
[解決済み] ReactJsのCreateClassは関数ではない
-
[解決済み] リアクトです。<tr>は<td>の子として表示できません。コメント > td > tr を参照してください。
-
[解決済み] 'Proptypes'が定義されていない
-
[解決済み] react nativeで関数だらけのヘルパーファイルを作成する方法は?
-
[解決済み] ReactJs "インバリアント違反..." リアクトの古典的な問題
-
[解決済み] Static HTML elements with event handlers require a role." を修正するにはどうすればよいですか?
-
[解決済み] ESLintとTSLintの違い【クローズド】について