Reactコンポーネントのライフサイクルの詳細な説明

Reactコンポーネントのライフサイクルの詳細な説明

1.ライフサイクルとは何か

コンポーネントのライフサイクルは、人が生まれ、年を取り、病気になり、死ぬのと同じように、また自然界にも変化があるのと同じように、React の動作プロセスです。Web ページ内のすべてのコンポーネントは、生物と同じように作成、更新、削除されます。

Reactコンポーネントのライフサイクルは3つのプロセスに分けられます

  • マウントプロセス: DOM ツリー内のコンポーネントを初めてレンダリングするプロセスです。
  • 更新プロセス: コンポーネントが再レンダリングされるプロセス。
  • アンマウント プロセス: DOM からコンポーネントを削除するプロセス。

2. 読み込みプロセス

次の関数を順番に呼び出します: constructor、getInitialState、getDefaultProps、componentWillMount、render、componentDidMount。

1.コンストラクタ

これは ES6 のコンストラクターであり、コンポーネント クラスのインスタンスを作成します。このプロセスでは、状態の初期化とメンバー関数の this 環境のバインドという 2 つの手順が必要です。

2. レンダリング

レンダリングは、React コンポーネントの中で最も重要な機能です。これは、React で唯一無視できない関数です。レンダリング関数では、親要素は 1 つしか存在できません。 render 関数は純粋な関数です。実際にレンダリング アクションを実行するわけではありません。JSX で記述された構造にすぎません。最終的には、React がレンダリング プロセスを実行します。render 関数では操作は行われません。ページの記述は、this.state と this.props の戻り結果に完全に依存します。render で this.setState を呼び出すことはできません。

  • これを非常に鮮明に要約する式があります: UI=render(data)

3. コンポーネントWillMountとコンポーネントDidMount

これら 2 つの関数は、それぞれレンダリングの前と後に実行されます。このプロセスは通常、ブラウザ側でのみ呼び出すことができるため、ここでは非同期データを取得し、componentDidMount が呼び出されると、コンポーネントが DOM ツリーに読み込まれます。

3. 更新プロセス

簡単に言えば、 componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate、render、componentDidUpdate。

1. コンポーネントはプロパティを受け取ります(次のプロパティ)

props が変更されたときだけ呼び出されるわけではありません。実際、親コンポーネントの render 関数が呼び出される限り、render でレンダリングされる子コンポーネントは更新されます。親コンポーネントから子コンポーネントに渡される props が変更されたかどうかに関係なく、子コンポーネントの componentWillReceiveProps プロセスがトリガーされます。ただし、この関数は新しい props の値に基づいて内部状態を更新するかどうかを計算するのに適しているため、this.setState メソッドのトリガー プロセスはこの関数を呼び出しません。

2. コンポーネントを更新する必要があります(nextProps、nextState)

この関数の重要性はレンダリングに次ぐものです。レンダリング関数はレンダリングするものを決定し、shouldComponentUpdate はレンダリングする必要がないものを決定します。どちらも関数を返す必要があります。このプロセスにより、パフォーマンスが向上し、不要な再レンダリング プロセスが無視されます。

3. コンポーネントWillUpdateとコンポーネントDidUpdate

読み込みプロセスとは異なり、ここでのcomponentDidUpdateはブラウザ側とサーバー側の両方で実行できます。

4. レンダリングをトリガーする

React では、レンダリングをトリガーするパスが 4 つあります。

以下は、shouldComponentUpdate がデフォルトで true を返すことを前提としています。

(1)初期レンダリング

(2) this.setState を呼び出します (すべての setState 呼び出しがレンダリングをトリガーするわけではありません。React は操作をマージして一度にすべてをレンダリングする場合があります)。

(3)親コンポーネントが更新されます(通常はpropsが変更されますが、propsが変更されていない場合や親コンポーネントと子コンポーネント間でデータの交換がない場合でも、レンダリングがトリガーされます)。

(4)this.forceUpdateを呼び出します。

ここに画像の説明を挿入

注: shouldComponentUpdate で false を返すと、更新パスを早期に終了できます。

4. アンインストールのプロセス

実際に使われることはほとんどありません。ここにはcomponentWillUnmountが1つだけあります。一般的には、componentDidMountに登録されたイベントをここで削除する必要があります。

5. ライフサイクルプロセス

1. レンダリングを初期化して初めて表示する: ReactDOM.render()

  • constructor():オブジェクトを作成し、状態を初期化する
  • componentWillMount() :挿入されるコールバック
  • render() :仮想DOMコールバックを挿入するために使用される
  • componentDidMount() :コールバックが挿入されました

2. 毎回状態を更新する: this.setState()

  • componentWillUpdate() : 更新されるコールバック
  • render() : 更新(再レンダリング)
  • componentDidUpdate() : 更新されたコールバック

3. コンポーネントを削除する: ReactDOM.unmountComponentAtNode(containerDom)

  • componentWillUnmount(): コンポーネントは削除されます。

6. 例

 <div id='コンテナ'></div>
    <script type="text/babel">
        クラスLifeCycleはReact.Componentを拡張します。
            コンストラクタ(props) {
                スーパー(小道具);
                alert("初期レンダリング");
                アラート("コンストラクタ");
                this.state = {str: "hello"};
            }
             コンポーネントマウント() {
                アラート("コンポーネントがマウントされます");
            }
            コンポーネントマウント() {
                アラート("コンポーネントがマウントされました");
            }
            コンポーネントはプロパティを受け取ります(次のプロパティ) {
                アラート("コンポーネントがプロパティを受け取る");
            }
            コンポーネント更新() {
                アラート("コンポーネントを更新する必要があります");
                return true; // trueを返すことを忘れないでください
            }
             コンポーネントWillUpdate() {
                アラート("コンポーネントが更新されます");
            }
            コンポーネントを更新しました() {
                アラート("コンポーネントが更新されました");
            }
            コンポーネントのマウントを解除します(){
                アラート("コンポーネントがマウント解除されます");
            }
            状態を設定する() {
                s = "hello"とします。
                (this.state.str === s)の場合{
                    s = "こんにちは";
                }
                this.setState({
                    str: s
                });
            }
            強制更新() {
                this.forceUpdate();
            }
            与える() {
                アラート("レンダリング");
                戻る(
                    <div>
                        <span>{"プロパティ:"><h2>{parseInt(this.props.num)}</h2></span>
                        <br />
                        <span>{"州:"><h2>{this.state.str}</h2></span>
                    </div>
                );
            }
        }
        クラスコンテナはReact.Componentを拡張します。
            コンストラクタ(props) {
                スーパー(小道具);
                この状態 = {
                    数値: Math.random() * 100
                };
            }
            プロパティの変更(){
                this.setState({
                    数値: Math.random() * 100
                });
            }
            ライフサイクルステートを設定する() {
                this.refs.rLifeCycle.setTheState();
            }
            強制ライフサイクル更新() {
                this.refs.rLifeCycle.forceItUpdate();
            }
            アンマウントライフサイクル() {
                // ここで親コンポーネントをアンマウントすると、子コンポーネントもアンマウントされます ReactDOM.unmountComponentAtNode(document.getElementById("container"));
            }
            親強制更新() {
                this.forceUpdate();
            }
            与える() {
                戻る (
                    <div>
                        <a href="javascript:;" onClick={this.propsChange.bind(this)}>propsChange</a>
                        &nbsp;&nbsp;&nbsp;
                        <a href="javascript:;" onClick={this.setLifeCycleState.bind(this)}>状態の設定</a>
                        &nbsp;&nbsp;&nbsp;
                        <a href="javascript:;" onClick={this.forceLifeCycleUpdate.bind(this)}>強制更新</a>
                        &nbsp;&nbsp;&nbsp;
                        <a href="javascript:;" onClick={this.unmountLifeCycle.bind(this)}>アンマウント</a>
                        &nbsp;&nbsp;&nbsp;
                        <a href="javascript:;" onClick={this.parentForceUpdate.bind(this)}>parentForceUpdateWithoutChange</a>
                        <ライフサイクル ref="rLifeCycle" num={this.state.num}></ライフサイクル>
                    </div>
                );
            }
        }
        ReactDOM.render() は、
            <コンテナ></コンテナ>,
            document.getElementById('コンテナ')
        );
    </スクリプト>

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • React クラスコンポーネントのライフサイクルと実行順序
  • Reactコンポーネントのライフサイクルの例
  • React Nativeのコンポーネントのライフサイクルについての簡単な説明
  • Reactコンポーネントのライフサイクルの詳細な説明
  • 一般的な js-react コンポーネントのライフサイクル

<<:  DockerがElasticsearch7.xを起動してエラーを報告する問題を解決する

>>:  Markodwnによるタイトル配置による同期スクロールのアイデアの詳細な説明

推薦する

MySQLクエリ時にフィールドにデフォルト値を割り当てる方法

必要フィールドをクエリする場合、フィールドに同じ値を指定する必要があります。この値はハードコードする...

CSSレコードテキストアイコン配置のいくつかのソリューション

開発中に画像とテキストが 1 行に表示されることはよくあります。2 つのインライン要素を揃えるのは通...

Linuxシステムのログの詳細な紹介

目次1. ログ関連サービス2. システム内の共通ログファイル1. ログ関連サービスCentOS 6....

CSSのtranslate(-50%,-50%)は水平および垂直の中央揃え効果を実現します。

translate(-50%,-50%) 属性:中央に配置するには、長さと幅の 50% だけ上と左...

MySQL における int の最大値の詳細な説明

導入2日前に見た問題について詳細に書きます。バイトコンピューターがバイナリに基づいていることは誰もが...

Remレイアウトを使用して適応性を実現する

以前、モバイル適応に関する記事を書きました。非常に長く、内容が多すぎて読みづらいものでした。そこで、...

WindowsX Hyper-V ベースの CentOS システムをインストールする

現在、Linux を使用するほとんどの人は、クラウド サーバーを使用するか、Windows 上に仮想...

表の最初の行と最初の列を固定し、適応型ウィンドウを実現するための CSS の例コード

今日のキャンパス採用筆記試験では、固定された最初の行と最初の列を実装し、幅をウィンドウの変更に適応さ...

Vue3.0 エラーの解決策: モジュール 'worker_threads' が見つかりません

vue3.0 への最初の試みを記録します。プロジェクトを開始したときに、「モジュール 'wo...

正規表現に基づくあいまい文字列置換を実装するMySQLの方法の分析

この記事では、例を使用して、MySQL を使用して正規表現に基づくあいまい文字列置換を実装する方法を...

Windows 環境での MySQL の解凍、インストール、バックアップ、復元

システム環境はserver2012です1. MySQLの解凍バージョンをダウンロードし、インストール...

JavaScript BOMの構成と一般的なイベントの詳細な説明

目次1. 部品2. BOMの構成2. ウィンドウオブジェクトの共通イベント1. ウィンドウ読み込みイ...

Xtrabackup を使用した MySQL バックアップ プロセスの詳細な説明

目次01 背景02 はじめに03 ワークフロー04 いくつかの質問05 ファイルをバックアップする0...

Linux インストール Redis 実装プロセスとエラー解決

今日、redis をインストールしたところ、今までになかったいくつかのエラーが発生しました。ここで記...

JavaScript におけるイベント バブリング メカニズムの詳細な分析

バブリングとは何ですか? DOM イベント フローには、イベント キャプチャ ステージ、ターゲット ...