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によるタイトル配置による同期スクロールのアイデアの詳細な説明

推薦する

Vueは単一ファイルコンポーネントの完全なプロセス記録を実装します

目次序文単一ファイルコンポーネント基本概念シンプルなローダーコンポーネントコンテンツの解析コンポーネ...

MySQL サービス 1067 エラーの解決策: mysql 実行可能ファイルのパスを変更する

今日、MySQLサービス1067エラー問題に遭遇しました。システムアカウントを使用するように設定して...

MySQLトリガーの使用と注意すべき点

目次トリガーについてトリガーの使用トリガーを作成するトリガーを表示トリガーの削除使用上の注意新旧の違...

ファイルが存在するかどうかを判断する JavaScript サンプルコード

1. ビジネスシナリオ最近はファイルのアップロードやダウンロードに関する開発をしています。ダウンロー...

MySQL並列レプリケーションの簡単な説明

1. 並列レプリケーションの背景まず、並列レプリケーションの概念はなぜ存在するのでしょうか? 1. ...

MySQLのCOUNT(*)のパフォーマンスについてお話しましょう

序文基本的に、職場のプログラマーは、count(*)、count(1)、または count(prim...

Windows 64 ビット版 MySQL 5.7 以降の解凍パッケージにデータディレクトリと my-default.ini がなく、サービスが起動できない問題の簡単な解決方法 (問題概要)

私は SQL の初心者で、オープンソースのインストールは非常に簡単だと思っていましたが、その過程でい...

nginx でディレクトリ ホワイトリストと IP ホワイトリストを設定する方法

1. ディレクトリホワイトリストを設定する:指定されたリクエストパスに制限を設定しないでください。た...

CSS3の3D効果を使って立方体を作成する

CSS3 の 3D 効果を使用して立方体を作成する方法を学ぶと、3D シーンの回転と変位のプロパティ...

Dockerはローカルディレクトリとデータボリュームコンテナ操作をマウントします

1. DockerはローカルディレクトリをマウントしますDocker は、ホスト上のディレクトリをイ...

個人履歴書を作成するための HTML の簡単な実装

履歴書コード: XML/HTML コードコンテンツをクリップボードにコピー<!DOCTYPE ...

Vue Element-ui テーブルはツリー構造テーブルを実現します

この記事では、ツリー構造テーブルを実現するためのElement-uiテーブルの具体的なコードを参考ま...

JavaScript タイマーの詳細

目次1. 簡単な紹介2. 間隔を設定する2.1 説明2.2 パラメータ2.3 戻り値2.4 使用法3...

MySQL Order By 複数フィールドのソートルールのコード例

事前に言っておく気まぐれですが、MySQL の order by sorting にどのようなルール...

JavaScript による Web ページ カルーセルの超詳細な実装

目次HTML ページの作成js部分の機能を実装する1. 左ボタンと右ボタン2. 小さな円を動的に生成...