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 システム

推薦する

CSS プロパティ display:flow-root 宣言を 1 つの記事でマスターする

zhangxinxu より https://www.zhangxinxu.com/wordpress...

Centos6 で 20TB を超えるディスクをパーティション分割してフォーマットするためのサンプル コード

1. サーバー環境の構成: 1. ディスクパーティションを確認します。最近、あるプロジェクト内のサー...

CSS を使用して画像の色を変更する 100 の方法 (収集する価値あり)

序文「画像処理というと、PhotoShop などの画像処理ツールを思い浮かべることが多いです。フロン...

DockerにElasticsearch7.6クラスタをインストールしてパスワードを設定する方法

目次基本的な設定バージョンとDockerイメージについて始めるelasticsearch.ymlにつ...

Windows 10 Home Edition に Docker をインストールする方法

最近、プロジェクトをアップグレードするために Docker を使用しました。これまで使用したことがな...

バックエンドの権限に基づいてナビゲーション メニューを動的に生成する Vue-router のサンプル コード

目次js の1. グローバルガードを登録する2. Vuex 状態管理グローバルキャッシュルート3. ...

Douyin ロゴを作成する手順の CSS3 分析

「Tik Tok」も大人気で、ユーザー数は7億人と言われています。今日は、注目を集めるためにTikT...

MySQL の InnoDB ストレージ ファイルの詳細な説明

物理的に言えば、InnoDB テーブルは、共有テーブルスペース ファイル (ibdata1)、排他テ...

Angularコンポーネントの仲介モードの詳細な説明

目次1. 仲介業者モデル2. 例1. 見積コンポーネントに購入ボタンを追加する2. 親コンポーネント...

jQueryは画像の強調表示を実現します

ページ上の画像を強調表示することは非常に一般的です。ここでは、jQuery を使用して画像を強調表示...

ウェブページの読み込み進捗状況バーの詳細な説明(推奨)

(Web ページの読み込み中に、コンテンツが多すぎて読み込みと待機が続くことがあります。このとき、...

Win2008 サーバー セキュリティ チェック手順ガイド (日常のメンテナンス手順)

ドキュメントはしばらく前から書いていましたが、アップロードする勇気がありませんでした。サーバーのセキ...

HTML メタタグの一般的な使用例のコレクション

マタタグとは<meta> 要素は、検索エンジン向けの説明やキーワード、更新頻度など、ペー...

SQL インジェクションのある Web サイトを見つける方法 (必読)

方法 1: Google の詳細検索を使用します。たとえば、次に示すように.asp?id=9などの ...

MySQLが中国語の文字を挿入する問題を永久に解決するコツを教えます

目次序文最初のステップ:ステップ2: このmy.iniを変更する要約する序文問題の説明:不正な文字列...