Reactの基本のまとめ

Reactの基本のまとめ

序文

最近、面接の準備をしています。 react のいくつかの知識ポイントを確認し、ここにまとめました。

始める

Reactライフサイクル

React 16以前のライフサイクルはこんな感じでした

コンポーネントは最初にレンダリングされるときにインスタンス化され、その後インスタンス上の componentWillMount、render、および componentDidMount 関数が呼び出されます。コンポーネントは、レンダリングを更新するときに、componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate、render、および componentDidUpdate 関数を呼び出すことができます。コンポーネントがアンインストールされるときに、componentWillUnmount 関数を呼び出すことができます。

借りた写真:

React v16.3 以降では、componentWillMount、componentWillReceiveProps、componentWillUpdate の代わりに getDerivedStateFromProps と getSnapshotBeforeUpdate を使用することが推奨されています。ここで注意すべき点は、新しく追加された 2 つのライフサイクル機能と、元の 3 つのライフサイクル機能は別々に使用する必要があり、混在させることはできないということです。

現在のライフサイクル(借用画像):

コンポーネントWillMountの問題

白い画面を回避するために、componentWillMount で事前に非同期リクエストを行うことができると考える人もいます。ただし、React がページをレンダリングするために render を呼び出す場合、render はレンダリング用のデータを取得する前に非同期リクエストが終了するのを待ちません。このように書くと潜在的なリスクが伴います。

また、React Fiber の後では、1 回のレンダリングで複数回呼び出される場合があります。その理由は、React Fiber テクノロジーは増分レンダリングを使用してフレーム落ちの問題を解決しているためです。各タスク ユニットは requestIdleCallback を通じてスケジュールされ、実行され、中断および再開が可能です。ライフサイクルが中断されると、回復後に以前のライフサイクルが再度実行されます。

新しいライフサイクル

静的 getDerivedStateFromProps

  • トリガー時間 (v16.4 で変更): コンポーネントが再レンダリングされるたび (コンポーネントがビルドされた後 (レンダリング前の最後の実行) を含む)、および新しいプロパティまたは状態が取得されるたび。バージョンv16.3では、コンポーネントの状態の更新はこのライフサイクルをトリガーしません。
  • 新しいプロパティが受信されるたびに、新しい状態としてオブジェクトが返されます。 null が返された場合は、状態を更新する必要がないことを意味します。
  • componentDidUpdateを使用すると、componentWillReceivePropsのすべての使用法をオーバーライドできます。

更新前にスナップショットを取得する

トリガー時間: 更新が発生したとき、レンダリング後、コンポーネント DOM レンダリング前。
componentDidUpdate の 3 番目のパラメータとして値を返します。
componentDidUpdate と組み合わせることで、componentWillUpdate のすべての使用法をカバーできます。

リアクトファイバー

React のレンダリング/更新プロセスが開始すると、中断することができず、メインスレッドを占有し続けます。メインスレッドは JS の実行で忙しく、他の処理 (レイアウト、アニメーション) を処理する時間がなく、フレーム ドロップ、応答の遅延 (または応答なし) などのエクスペリエンスの低下につながります。ファイバーが誕生しました。

Fiber は、React Reconciler のコア アルゴリズムを再構築したものです。主な機能は次のとおりです。

  • インクリメンタルレンダリング(レンダリングタスクをチャンクに分割し、複数のフレームに均等に分散する)
  • 更新中にレンダリングタスクを一時停止、終了、再利用する機能
  • さまざまな種類の更新を優先する
  • 並行処理のための新しい基本機能

インクリメンタル レンダリングは、フレーム落ちの問題を解決するために使用されます。レンダリング タスクを分割した後、毎回小さな部分だけが実行されます。各部分が完了すると、時間制御はメイン スレッドに戻され、以前のように長時間占有されることはありません。

ファイバーツリー

  • Fiber の前のリコンサイラ (Stack リコンサイラと呼ばれる) は、上から下へ再帰的にマウント/更新し、中断できません (メイン スレッドを継続的に占有します)。その結果、メイン スレッド上のレイアウトやアニメーション、インタラクティブな応答などの定期的なタスクをすぐに処理できず、エクスペリエンスに影響を及ぼします。
  • Fiber は、レンダリング/更新プロセス (再帰 diff) を一連の小さなタスクに分割し、そのたびにツリーの小さな部分をチェックして、次のタスクを続行する時間があるかどうかを確認することで、この問題を解決します。時間がある場合は続行します。時間がない場合、それ自体を一時停止し、メイン スレッドがビジーでないときに続行します。

ファイバー ツリーは、実際には単一のリンク リスト構造であり、child は最初の子ノードを指し、return は親ノードを指し、sibling は次の兄弟ノードを指します。構造は次のとおりです。

// ファイバーツリーノード構造 {
    状態ノード、
    子供、
    戻る、
    兄弟、
    ...
}

ファイバーリコンサイラ

調整プロセスは 2 つの段階に分かれています。

1. (中断可能) レンダリング/調整は、workInProgressツリーを構築して変更を導出します。

2. (中断不可能な)コミットはこれらのDOMの変更を適用します(DOMツリーを更新し、コンポーネントライフサイクル関数を呼び出し、refなどの内部状態を更新します)

workInProgress ツリーを構築するプロセスは、diff のプロセスです。requestIdleCallback を通じてタスクのグループをスケジュールします。各タスクの完了後、キュー ジャンパー (より緊急) があるかどうかを確認します。各タスクのグループが完了したら、次の requestIdleCallback コールバックまで時間制御をメイン スレッドに戻し、workInProgress ツリーの構築を続行します。

ライフサイクルも 2 つの段階に分かれています。

// フェーズ 1 レンダリング/調整
コンポーネントマウント
コンポーネントがプロパティを受け取る
コンポーネント更新が必要
コンポーネントの更新

//フェーズ2コミット
コンポーネントマウント
コンポーネントの更新
コンポーネントのマウントを解除する

フェーズ 1 のライフサイクル関数は複数回呼び出される場合があります。デフォルトでは低い優先度で実行されます。優先度の高いタスクによって中断された場合は、後で再実行されます。

ファイバーツリーとworkInProgressツリー

ダブルバッファリング技術: workInProgress ツリーが構築された後、新しいファイバー ツリーが取得され、現在のポインターが workInProgress ツリーを指すことを意味します。ファイバーと workInProgress は相互に参照を保持しているため、古いファイバーは新しいファイバーの更新用の予約領域として使用され、ファイバー インスタンスの再利用の目的が達成されます。

各ファイバーには代替プロパティがあり、これもファイバーを指します。workInProgress ノードを作成するときは、代替が優先されます。代替がない場合は、作成します。

workInProgress を current.alternate にします。
作業進行中の場合 === null
  //...
  workInProgress.alternate = 現在;
  現在の代替 = 作業進行中;
} それ以外 {
  // 代替案はすでにあります。
  // エフェクトタグをリセットします。
  workInProgress.effectTag = 効果なし;

  // エフェクト リストは無効になりました。
  workInProgress.nextEffect = null;
  workInProgress.firstEffect = null;
  workInProgress.lastEffect = null;
}

これを行う利点:

  • 内部オブジェクト(ファイバー)を再利用する機能
  • メモリ割り当てとGC時間のオーバーヘッドを節約

光ファイバー障害復旧

割り込み: 現在処理中の作業単位を確認し、現在の結果 (firstEffect、lastEffect) を保存し、タグを変更し、すぐに終了して別の requestIdleCallback を開き、次回機会があれば実行します。

ブレークポイントの回復: 次に作業単位を処理するときに、タグが中断されたタスクであることがわかり、未完了の部分の実行を続行するか、やり直します。

PS 時間切れによる「自然な」中断であっても、優先度の高いタスクによる無礼な中断であっても、中断メカニズムは同じです。

リアクトセットステート

コード内で setState 関数を呼び出した後、React は渡されたパラメーター オブジェクトをコンポーネントの現在の状態とマージし、いわゆる調整プロセスをトリガーします。調整プロセスの後、React は比較的効率的な方法で新しい状態に応じて React 要素ツリーを構築し、UI インターフェース全体の再レンダリングに進みます。 React は要素ツリーを取得した後、新しいツリーと古いツリー間のノードの違いを自動的に計算し、その違いに基づいてインターフェースを最小化して再レンダリングします。差分計算アルゴリズムでは、React はどの位置が変更されたか、どのように変更する必要があるかを比較的正確に把握できるため、完全な再レンダリングではなくオンデマンドの更新が保証されます。

setState は同期的に呼び出される場合(settimeout、カスタム DOM イベント)と、非同期的に呼び出される場合(通常の呼び出し)があります。

Reactイベントメカニズム

React イベントは、イベント プロキシを通じて最も外側のドキュメントに均一に分散され、実際の Dom ノードにバインドされません。 さらに、React はネイティブの Event オブジェクトを内部的にラップします。 stopPropagation() や preventDefault() など、ブラウザのネイティブ イベントと同じインターフェースを備えています。

以上がReactの基礎知識のまとめの詳しい内容です。Reactの基礎知識についてさらに詳しく知りたい方は、123WORDPRESS.COM内の他の関連記事もぜひご注目ください!

以下もご興味があるかもしれません:
  • React Native が「NSArray<id<RCTBridgeModule>>型のパラメータを初期化できません」というエラーを報告する (解決方法)
  • Reactの親コンポーネントと子コンポーネント間のデータ転送の詳細な説明
  • Reactにおけるキーの役割の詳細な説明
  • React 入門レベルの詳細なメモ

<<:  MySQL でメタデータ ロックがブロックされている場所を確認する方法

>>:  VMware Workstation のインストール Linux システム

推薦する

Web デザイン体験: 5 つの優れた Web デザイン コンセプトの完全分析 (画像)

他の種類のデザインとは異なり、Web デザインは時代の発展とともに常に変化しています。したがって、W...

MySQL の簡単な分析 - MVCC

バージョンチェーンInnoDB エンジン テーブルでは、クラスター化インデックス レコードに 2 つ...

nginx を介して方向プロキシを実装するプロセスの図

この記事は主に、nginx を介して方向プロキシを実装するプロセスを紹介します。この記事のサンプル ...

Linux ユーザー スクリプトの作成/推測ゲーム/ネットワーク カード トラフィック監視の紹介

目次1. ユーザーが作成したスクリプト2. 単語当てゲーム3. ネットワークカードのトラフィック監視...

JavaScript で二分探索木を実装する

JavaScriptでの検索二分木実装は参考までに。具体的な内容は以下のとおりです。バイナリ検索木 ...

CSSはラジオをクリックして2つの画像スタイルを切り替えますが、複数のラジオのうち1つだけをチェックできます。

クリックされたボタンには赤い画像スタイルを実装し、選択されていない他のボタンには灰色の画像スタイルを...

モバイルデバイスでのフリーズ問題に対する CSS3 ソリューション (アニメーション パフォーマンスの最適化)

1. CSS、jQuery、Canvasを使用してアニメーションを作成する1. キャンバス利点: ...

MySQLパスワードを忘れた場合のいくつかの解決策

解決策1完全にアンインストールしてすべてのデータを削除します。まず、MySQLに関連するすべてのプロ...

Linux で Redis のリモート接続を実装する方法

LinuxにRedisをインストールしたら、Javaを使って接続します。Javaコードは次のとおりで...

MYSQL 文字関数を使用してデータをフィルタリングすることに関する質問

問題の説明:構造:テストには2つのフィールドがあります。これらは col1 と col2 で、どちら...

Zabbix はどのようにして ssh 経由でネットワーク デバイス データを監視および取得するのでしょうか?

シナリオシミュレーション:ある会社の運用保守担当者は、以前購入した一連のネットワーク機器の光ポートの...

MySQLにおける(JOIN/ORDER BY)文のクエリ処理と最適化方法

EXPLAIN ステートメントは、MySQL クエリ ステートメント プロセスと EXPLAIN ス...

Dockerはコンテナを通じてイメージを生成し、詳細にDockerCommitを送信します

目次ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを...

Mysqlの日付と時刻関数を扱う記事

目次序文1. 現在の時刻を取得する1.1 現在の日付と時刻を返す1.2 現在の日付を取得する1.3 ...

Linux での Python スクリプトの自動起動とスケジュール起動の詳細な手順

1. Pythonは起動時に自動的に実行されますPython の自己起動スクリプトがauto.pyで...