React 合成イベントの説明

React 合成イベントの説明

React 合成イベントとは、js を使用して Dom イベント フローをシミュレートする React を指します。 (ファイバー ツリーは Dom ツリー構造をシミュレートします) 合成イベントのイベント フローがキャプチャされ、ファイバー ツリーにバブル化されます。

入力ボックスをクリックして開始します

入力ボックスをクリックすると、React はルートノード (注 1) で focus イベント (注 2) (注 3) をリッスンします。

ネイティブ イベントから対応する仮想 Dom を見つけるにはどうすればよいでしょうか?

この時点で、React が取得する唯一の情報はネイティブ イベント オブジェクト (nativeEvent) です。 ReactはnativeEventに対応するDom(eventTarget)を使ってDomツリーを遡り、eventTargetに最も近いreactが管理するDomノード(注4)(注5)を探し、対応するファイバーAを取得します。

次に、イベントプラグイン(注6)を介して、合成イベント(注7)Aを作成します。合成イベント A は、React によってシミュレートされたイベント フローのイベント ソースと見なされ、ファイバー A は、React によってイベント ターゲットと見なされます。

合成イベントストリーム?

ファイバー A から上方 (最上位ファイバー HostComponent まで) のすべてのホスト タイプ ファイバーを収集します。 次に、収集されたファイバーアレイは後ろから前(キャプチャ)へ、次に前から後ろ(バブル)へ移動されます。トラバーサルが実行されるたびに、現在のトラバーサル項目のファイバーノードにバインドされたフォーカスイベントが収集されます(注8)。その後 (イベント プラグインが完了した後、つまり合成イベントが生成された後)、foucs コールバックはコレクションの順序で実行されます。これは、React がイベント フローをシミュレートする方法です。

拡張機能

入力ボックスをクリックすると複数のイベントが発生します

フォーカスに加えて、クリックなどの他のイベントもトリガーされます。 React はルート ノードでさまざまな種類のイベントをリッスンします。イベントがリッスンされるたびに、イベントは 1 回ディスパッチされます。イベントの種類が複数ある場合は、複数回ディスパッチされます。 入力ボックスをクリックするとフォーカスがトリガーされ、連続してクリックされます。フォーカス イベントがディスパッチされると、クリック イベントがディスパッチされます。 イベントがディスパッチされるたびに、保留中の同期タスク キュー (flushSyncCallBackQueue) が処理されます。

予期しないレンダリングですか?

NoMode モードでは、イベントが複数回ディスパッチされ、各イベントによって状態が変更される場合 (setState の呼び出しなど)、対応するコンポーネントが複数回レンダリングされます。 この例では、入力ボックスをクリックし、フォーカス イベントとクリック イベントを入力にバインドし、イベント コールバックが setState を呼び出すと、入力が 2 回レンダリングされます。

値を設定した後、React の入力が制御されたコンポーネントになるのはなぜですか?

react では、input に value 属性が設定されている場合、入力ボックスに何が入力されても入力ボックスの値は変更されません。入力コンポーネントの状態を変更しない限り。シミュレートされたイベント ストリームを処理した後、React はメソッドを呼び出して予期しない効果をリセットします。 たとえば、このシナリオでは、入力に値を入力すると、入力ボックスには入力した値が表示されますが、入力値は対応するファイバーの value プロパティによってすぐに更新されます (finishEventHander は制御されたコンポーネントをリセットします)。 入力に値が設定されていない場合は無視されます。

合成イベント プロパティにアクセスできない場合があるのはなぜですか?

イベント フロー (バブリングをキャプチャ) が完了した後、React は合成イベント オブジェクトを解放します (SyntheticEvent.prototype.destructor は合成イベント オブジェクトのプロパティをリセットします)。

React はイベントのバブリング防止とデフォルトの動作をどのようにシミュレートしますか?

React はイベント フローの順序に従ってコールバックを実行します。実行前に、現在の合成イベント オブジェクトがバブリングを防ぐ状態にあるかどうかを確認します。そうである場合は、イベント フローを終了します。 React の合成イベント オブジェクト プロトタイプはネイティブ機能を強化します。ネイティブ イベント メソッドのバブリング防止とデフォルト動作防止がカプセル化されています (ネイティブ イベント メソッドも内部的に呼び出されます)。

注記

注1: ​​ルートノードは react-v16 ではドキュメント、 react-v17 ではマウントコンテナ Dom です。
注 2: focus イベントはバブリング イベントではなく、react はキャプチャ フェーズで非バブリング イベントをリッスンします。 注 3: ルート ノードは、submit、reset、invalid、media イベントなどの特別な例外を除き、すべてのイベントをリッスンします。 注 4: react がファイバー ツリーを Dom ツリーにマウントすると、各ホスト タイプのファイバー ノードは Dom ノードに 1 つずつ対応し、リンクされます。 注 5: 上方向の検索は、サードパーティのスクロール プラグインなど、子 Dom ノードが react で管理されていない場合があるためです。 注 6: Dom イベントをシミュレートするために、react は補足します 注 7: react 内のコンストラクタのインスタンス。合成イベントの一部のプロパティは nativeEvent から取得されます。合成イベントはファイバーに関連付けられます。注 8: 実行されるのではなく、収集されます。 Reactは特定のタイプのイベントをバッチ処理するため

以上がReact合成イベントの詳しい説明の内容です。React合成イベントについてさらに詳しく知りたい方は、123WORDPRESS.COMの他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • ReactプロジェクトにSCSSを導入する方法
  • ReactでAngularコンポーネントを導入する方法
  • ReactはコンテナコンポーネントとディスプレイコンポーネントをVueに導入します
  • React の国際化 react-intl の使用
  • ReactのPropsの簡単な比較
  • antd+reactプロジェクトをviteに移行するためのソリューションの詳細な説明
  • Reactイベントスロットリング効果が失敗する理由と解決策
  • Amap を使用した React 実装例 (react-amap)
  • Reactの簡単な紹介

<<:  MySQL無料インストール版のパスワードの設定と変更に関するチュートリアル

>>:  CentOS7 は rpm を使用して MySQL 5.7 をインストールするチュートリアル図

推薦する

Docker-compose は Docker プライベート ウェアハウスのステップを迅速に構築します

docker-compose.ymlを作成し、次の内容を入力します。 バージョン: '3&#...

Vueのログインとログアウトの詳細な説明

目次ログインビジネスプロセスログイン機能の実装要約するまず、エフェクトの実装プロセスを見てみましょう...

VMware+centOS 8 で http プロトコルに基づく Git サービスを構築する方法

目次1. 原因2. デバイス情報3. 準備4. Apacheをインストールする5. gitを設定する...

Vueのキーボードイベントの詳細な説明

目次共通キーエイリアスエイリアスが指定されていないキーシステム修飾キーカスタムキーエイリアス要約する...

意外と知らないLinuxのSSHコマンドの使い方7選を徹底解説

システム管理者は複数のサーバーを同時に管理する場合があり、これらのサーバーは異なる場所に配置されてい...

MySQL REVOKE でユーザー権限を削除する

MySQL では、REVOKE ステートメントを使用してユーザーの特定の権限を削除できます (ユーザ...

Dockerパッケージイメージの実装と構成の変更

最近、Docker の学習や実際の運用で多くの問題に遭遇したので、それを記録するためにブログを書きま...

MySql の知識ポイント: トランザクション、インデックス、ロックの原則、使用状況の分析

この記事では、トランザクション、インデックス、ロックなどの MySQL の知識ポイントの原理と使用法...

MySQL5.7.17 winx64 インストール バージョン構成方法 Windows Server 2008 R2 でのグラフィック チュートリアル

参考までに、Winでmysql5.7をインストールします。具体的な内容は次のとおりです。 @Auth...

HTMLセマンティクスと関連するフロントエンドフレームワークの詳細な分析

セマンティクスについて意味論は、記号やシンボルとそれらが表す意味との関係を研究する学問です。言語学で...

全体的なユーザーエクスペリエンスを確保する方法

関連記事:ユーザーエクスペリエンスのためのウェブサイトデザイン今朝、GMail がまた不調になり、接...

MySQL でデータの重複挿入を回避する 4 つの方法

最も一般的な方法は、フィールドに主キーまたは一意のインデックスを設定することです。重複データを挿入す...

MySQLのユーザー管理とPostgreSQLのユーザー管理の違い

1. MySQL ユーザー管理[例1.1] ローカルMySQLサーバーのテストデータベースにroot...

MySQLデータベースにパスワードを入力した後にフラッシュバックする問題の解決策

パスワード入力後にMySQLデータベースがクラッシュする問題と解決策1 ケースの説明最近、基本的な機...

Vueでスワイパープラグインを使用する際の問題を解決する

デモを作成するときにこのプラグインを使用していくつか問題が発生したため、プラグインの使用方法といくつ...