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

推薦する

HTMLタグの書き方でよくある間違い

注意を払う必要があります。HTML Police がコードを調べて、意味のないタグをすべて見つけ出す...

さようなら Docker: 5 分で Containerd に移行する方法

Docker は非常に人気のあるコンテナ技術です。K8S によって廃止され、別のコンテナ技術である ...

ゲームの Node.JS バージョンを作成する方法

目次概要ビルドプロセス関連APIリードライン基本的な使い方チョーククリア手順に関する追加情報完全なコ...

MySQL 5.7 MGR シングルマスター決定マスターノード方式の詳細説明

当銀行のMGRは年末に開始されます。公式文書を読んだり、毎日テストを受けたりしなければなりません。毎...

プライベートDockerリポジトリであるHarborをインストールするための詳細な手順

Harborのインストールは非常に簡単ですが、Dockerログインで行き詰まってしまいました。このブ...

vscodeを使用してuniappを開発する方法

私はフロントエンド プロジェクトの開発に常に vscode を使用してきたため、現在ではいくつかの小...

Mac Docker x509証明書の問題を解決する

質問最近、プライベートミラーセンターにログインする必要がありましたが、ログイン時にエラーメッセージが...

MySQL 最適化のヒント: 重複削除の実装方法の分析 [数百万のデータ]

この記事では、MySQL 最適化のヒントで重複したエントリを削除する方法を例を使って説明します。ご参...

HTML Web ページ リスト タグ学習チュートリアル

HTML Web ページ リスト タグの学習チュートリアル。 HTML ページでは、リストはアウトラ...

HTML を使用して IE8 および IE9 の互換表示モードを無効にするヒント

IE 8 以降では互換モードが追加され、これを有効にすると IE の下位バージョンでレンダリングされ...

Ubuntu 16.04 で Python 3 を使用して Django プロジェクトを作成し、実行する方法

ステップ1: Djangoプロジェクトを作成するターミナルを開き、書き込みたいプロジェクトのアドレス...

JSはUUIDとNanoIDというユニークなIDメソッドを生成します

目次1. NanoIDがUUIDに取って代わる理由2. jsを生成する方法3. ナノID方式序文:ユ...

Linuxサービスの監視と運用および保守

目次1. psutilパッケージをインストールする次に、オペレーティングシステム内のすべてのサービス...

国内SNSのホームページを比較・分析して得た経験をみんなで共有(写真)

この記事では、ソーシャル ウェブサイトのホームページを比較分析することで洞察を得て、ソーシャル ウェ...

アコーディオンセカンダリメニューを実装するためのjQueryプラグイン

この記事では、jQueryプラグインを使用してアコーディオンセカンダリメニューを作成します。具体的な...