ReactでのsetStateの使用と同期と非同期の使用

ReactでのsetStateの使用と同期と非同期の使用

React では、this.state を使用して状態を直接変更しても、コンポーネントは再レンダリングされません。コンポーネントのプロパティを変更するには、this.setState を使用する必要があります。

1. this.setStateを定義する2つの方法

初期状態の定義

状態 = { カウント: 0 },

この時点でボタンがある場合は、ボタンをクリックしてカウントを1増やします。2つの方法で記述できます。

(1)譲渡対象

this.setState({ count: this.state.count + 1})

(2)伝達関数

this.setState((state, props) => ({ count: count + 1}))

2. setState の 2 つのメソッドの違いは何ですか?

変更された状態の値が以前の状態の値に依存する必要がある場合は、次のような関数が必要です。

カウントを追加します(){
  this.setState({ count: this.state.count + 1})
  this.setState({ count: this.state.count + 1})
  this.setState({count: this.state.count + 1}) を返します。
}

このとき、React 内部で複数の setState 操作がマージされ、新しい状態が Object.assgin({}, {count: 0}, {count: 1}) によってマージされるため、+1 操作は 1 回のみ実行されます。上記の割り当ては 3 回実行されますが、count の値が更新されないため、最終的な実行結果は +1 のみになります。setState の割り当てが関数の場合、状況は異なります。

カウントを追加します(){
  this.setState((state, props) => ({ count: count + 1}))
  this.setState((state, props) => ({ count: count + 1}))
  this.setState((state, props) => ({ count: count + 1}))
}

この操作は、React が判断するため、+3 の効果が得られます。関数が渡された場合、この関数が実行され、そのときに count の値が変更されます。

3. setState は同期ですか、それとも非同期ですか?

☆☆☆☆☆は非同期です

(1)つまり、this.setStateで状態を変更した後、次の行で状態の値を出力しても新しい値は得られない。

(2)なぜ非同期なのか?

理由は 2 つあります。1 つは効率を上げるためです。状態値が変更されるたびに、レンダラーは再レンダリングされます。状態値を複数回マージして更新すると、パフォーマンスが向上します。もう 1 つは、レンダラーが後で更新されるためです。レンダラーにサブコンポーネントがある場合、サブコンポーネントのプロパティは親コンポーネントの状態に依存し、プロパティと状態を一致させることができません。

(3)非同期操作中に状態値を取得するにはどうすればいいですか?
①setStateのコールバック関数内

this.setState({ 
  カウント: this.state.count + 1}}, 
  ()=>{ console.log(this.state.count)})

②componentDidUpdateで取得する

コンポーネントの更新(){
  console.log(この状態の数)
}

☆☆☆☆☆は同期されています

(1)つまり、this.setStateで状態を変更した後、次の行で新しい状態の値を出力する。

(2)どのようなシナリオで同期が可能か?
①ネイティブjsがdom要素を取得し、イベントをバインドする

<button id="addBtn">クリックして +1</button>
コンポーネントマウント(){
   定数 addBtn = document.getElementById('addBtn')
   changeBtn.addEventListener('クリック',()=>{
       this.setState({ count: this.state.count + 1})
       console.log(この状態メッセージ)
   })
}

② タイマーsetTimeout

<button onClick={ e => this.addOne() }>クリックして +1 してください</button>
追加1(){
setTimeout(()=>{ this.setState({ count: this.state.count + 1 })
 console.log(this.state.count) },0) を実行します。
}

React での setState の使用と同期と非同期の使用に関するこの記事はこれで終わりです。React setState の同期と非同期に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • React における setState の同期または非同期の問題の理解
  • React における同期および非同期 setState の問題のコード分析
  • React での setState 同期および非同期シナリオの使用

<<:  Nginx における accept lock の仕組みと実装の詳細な説明

>>:  MySQLで重複行を削除する方法

推薦する

仕事の効率を上げるJS略語スキル20選

目次複数の変数を同時に宣言する場合は、1 行に短縮できます。分割代入は複数の変数に同時に値を割り当て...

フロントエンドとバックエンドを分離した nginx 構成を展開するための完全な手順

序文決まり文句です。ここでは、フロントエンドとバックエンドの分離についての私の理解についてお話ししま...

TypeScriptの列挙型を詳しく説明する

目次1. デジタル列挙2. 文字列の列挙3. 逆マッピング4. 異種列挙5. 定数列挙6. 列挙メン...

DockerはRedis5.0をビルドし、データをマウントします

目次1. 永続データの簡単なマウント2. DockerFileでイメージをビルドし、設定ファイルを指...

マスタークラスタに再参加する k8s ノードの実装

1. ノードを削除するkubectl delete node node01を実行します。 2. この...

Linux での MySQL のインストールに関するチュートリアル

目次1. 古いバージョンを削除する2. サーバーのカーネルタイプを確認し、適切なバージョンをダウンロ...

重複データの処理に関するMySQL学習ノート

MySQLは重複データを処理します一部の MySQL テーブルには重複レコードが含まれている場合があ...

CSS の Flex レイアウトを使用してシンプルな縦棒グラフを作成する方法

以下は、Flex レイアウトを使用した棒グラフです。 HTML: <div class=&qu...

JavaScript プロトタイプとプロトタイプチェーンの深い理解

目次1. プロトタイプとは何ですか? 2. プロトタイプ__プロト__ 4. コンストラクター5. ...

Linuxコマンドunzipの詳しい説明

目次1. 解凍コマンド1.1 構文1.2 オプション2. 例1. 解凍コマンドunzip コマンドは...

Ubuntu インストール cuda10.1 ドライバ実装手順

1. cuda10.1をダウンロードします。 NVIDIA 公式ウェブサイト リンク: https:...

js で 0ms 遅延タイマーを実装するいくつかの方法

目次キューマイクロタスク非同期/待機メッセージチャネルやっと付録ここ二日間、「タイムリーな setT...

Docker プライベートリポジトリの管理とローカルリポジトリ内のイメージの削除

1: Dockerプライベートウェアハウスのインストール1. イメージリポジトリからイメージをダウン...

MySQL の文字セット utf8 を utf8mb4 に変更する方法

MySQL 5.5 の場合、文字セットが設定されていない場合、MySQL のデフォルトの文字セットは...

HTML テーブル マークアップ チュートリアル (28): セルの境界線の色属性 BORDERCOLOR

テーブルを美しくするために、セルごとに異なる境界線の色を設定できます。基本的な構文<TD 境界...