React コンポーネントのコンストラクタとスーパーの知識ポイントのまとめ

React コンポーネントのコンストラクタとスーパーの知識ポイントのまとめ

1. Reactでクラス宣言する際のヒント

上記のように、Child クラスは class キーワードを使用して宣言され、React クラスから継承されます。

A. 子供のタイプは何ですか? typeofChild === 'function' は、実際には ES5 で宣言されたコンストラクターと同等です。 function Child() { // コンストラクターを宣言します}

B. Child クラスが呼び出されると (new Child())、それが最初に実行され、Child のコンストラクター関数が自動的に実行されます。

コンストラクタ() {
   console.log('コンストラクタが実行されました')
       「はっ」と返す
   }

   取得名() {
       console.log('メソッドが実行されました')
   }
}
var dd = new Person();
コンソール.log(dd)

次のように印刷されます。

3. これは Child クラスにありますか? this は Child のインスタンスを指しており、これは new Child() と同等です。それで、それらは完全に等しいのでしょうか? いいえ、React 内の this は new Child() に基づいてラップされます (下の図を参照)。

上の図は新しいChild()を示しています。次の図はChildでのこれを示しています。

結論: これは、いくつかの React 内部メソッドを含む、new Child() に基づいてラップされています。

同時に、コンポーネント内で Child クラス ( <div> <Child /> </div> ) が使用されており、これは new Child() + react パッケージとして確認できます。 (詳細は調査中…)

2. コンポーネント内のコンストラクターは必要ですか? そうでなかったらどうしますか? ?効果は何ですか? ? ?

ES6 の補足知識: http://es6.ruanyifeng.com/ は次のとおりです。

クラスColorPointはPointを拡張します{
}

// クラス ColorPoint は Point を拡張します {
  コンストラクタ(...引数) {
    super(...引数);
  }
}
// ご覧のとおり、コンストラクタは記述されていません。実行時に自動的に入力されます。

ES6 の継承ルールによれば、サブクラスがコンストラクターを記述するかどうかに関係なく、新しいインスタンスを作成するプロセスでコンストラクターが追加されます。

したがって、コンストラクター フック関数は必須ではなく、場合によってはサブコンポーネントを省略できます。

次に、コンストラクター フック関数の有無の違いを見てみましょう。

A. まずコンストラクタフック関数 this.constructor があるかどうかを確認します。

コンストラクターフック関数を持つ this.constructor

コンストラクタフック関数のない this.constructor

詳細を見てみると、コンストラクター フック関数がある場合、Child クラスに追加のコンストラクター メソッドがあることがわかります。

B. まず、コンストラクターフック関数、つまりコンポーネントインスタンスに this があるかどうかを確認します。

このインスタンスにはコンストラクター フック関数があります。

このインスタンスにはコンストラクタ フック関数がありません。

コンストラクタフック関数がある場合、状態を定義できることがわかります。ユーザーが状態を定義しない場合は、コンストラクタフック関数の有無に違いはありません。

結論: コンポーネントが独自の初期状態を定義する場合は、コンストラクター フック関数に記述する必要があります。

ユーザーが状態を使用しない場合、コンストラクター フック関数の有無にかかわらず、props を使用してパラメーターを受け入れます。コンストラクター フック関数は省略することもできます。

さらに、状態を使用しない場合は、ステートレス コンポーネント (推奨) を使用するのはなぜでしょうか? ? ?

3. スーパーに小道具は必要ですか? 機能は何ですか? ?

友人の中には、コンポーネントを書くたびにコンストラクターとスーパーに props を書くことに慣れている人がいます。これは必要なのでしょうか? ?

図に示すように:

まず、次の点を明確にすることが重要です。

コンストラクタを書く必要はありません。コンストラクタを書いたら、この関数に super() を書かなければなりません。

この時点で、コンポーネントには独自の this があり、 this キーワードをコンポーネント内でグローバルに使用できます。

それ以外の場合、それが単なるコンストラクターであり、super() が実行されない場合、後続の this はすべて間違ってしまいます。 ! !

ソース ES6: http://es6.ruanyifeng.com/

しかし、パラメータ props を super に記述する必要があるのでしょうか? ? 答えは必ずしもそうではありません。まずはコードを見てみましょう。

小道具付き:

小道具なし:

コンストラクターで this.props を使用する場合は、super (props) を追加する必要があることがわかります。

このとき、props または this.props を使用できます。これらは同じものです。 (ただし、props は任意のパラメータにすることができますが、this.props は固定の書き込み方法です)。

図に示すように:

this.props または props が custructor ライフサイクルで使用されていない場合は、 props を省略できます。

以下は、props を使用したシナリオです。このとき、componentWillReceiveProps ライフサイクルを忘れないでください。

別の記事「Reactのライフサイクルについて知っておくべきこと」を参照してください

続き:コンストラクタがsuperを通してpropsを受け取らない場合は、他のライフサイクルでは、

this.props は、componentWillMount、componentDidMount、render で直接使用できますか? ?

結論: はい、React はコンストラクターを除くライフサイクルで this.props を渡しており、super(props) の影響はまったく受けません。

したがって、super 内の props が受け取られるかどうかは、コンストラクターのライフサイクルで this.props が使用できるかどうかにのみ影響します。他のライフサイクルでは、this.props はデフォルトで既に存在しています。

これで、React コンポーネントのコンストラクターとスーパーの知識ポイントに関するこの記事は終了です。React コンポーネントのコンストラクターとスーパーに関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MapStruct とは何でしょうか?
  • Go トラバーサル構造体、マップ、スライスの実装
  • Golang 構造体、マップ、JSON 変換
  • Golangは対応するデータテーブル構造定義操作を生成する
  • Java MapStructはオブジェクトマッピングの問題を解決します
  • Go は Unmarshal を使用して json を構造体に割り当てます。原因と解決策
  • C# が入力パラメータとして構造体を使用して C 型 dll を呼び出す際の問題の詳細な説明
  • Java Structs フレームワークの原理ケースの詳細な説明

<<:  Windows で mysql-8.0.18-winx64 をインストールするチュートリアル (画像とテキスト付き)

>>:  サーバー上で selenium+chromedriver を実行するための詳細なチュートリアル

推薦する

layui をベースにしたログインページの実装

この記事の例では、ログインページを実装するためのlayuiの具体的なコードを参考までに共有しています...

Linux で pip 操作中にタイムアウトが発生する問題を解決する方法

Linuxインスタンスでpipを使用する際のタイムアウト問題を解決する方法pip は最も人気のある ...

Robots.txtの詳細な紹介

Robots.txt はプレーンテキスト ファイルであり、Web サイト管理者は、ロボットによるアク...

Linux のバックグラウンドで実行するいくつかの方法 (まとめ)

1. ノーフープハングアップ信号を無視してプログラムを実行する追加メモnohup コマンドは、ハン...

Vue が価格カレンダー効果を実現

この記事では、価格カレンダー効果を実現するためのVueの具体的なコードを例として紹介します。具体的な...

3つの簡単な例を使ってハイパーリンクの下線を削除する方法

ハイパーリンクの下線を削除するには、スタイルシート CSS を使用する必要があります。当面は CSS...

JTAを実装するためにAtomikosと組み合わせたTomcatについて

最近、プロジェクトは環境を切り替え、WebLogic を Tomcat に置き換えました。途中で発生...

ファイルをアップロードするときに enctype フィールドを使用する理由は何ですか?

FORM 要素の enctype 属性は、フォーム データがサーバーに送信されるときに使用されるエン...

WeChatアプレットはビデオプレーヤーのビデオコンポーネントを使用します

この記事の例では、WeChatアプレットのビデオプレーヤーコンポーネントの具体的なコードを参考までに...

Vue の計算プロパティとリスナーの使用の概要

1. 計算プロパティとリスナー1.1 計算プロパティ <!DOCTYPE html> &...

古い Vue プロジェクトに Vite サポートを追加する方法

1. はじめに会社のプロジェクトを引き継いで2年になります。今では毎回プロジェクトを起動するのに1分...

MySQL 権限とデータベース設計のケーススタディ

権限とデータベース設計ユーザー管理SQLyogを使用してユーザーを作成し、権限を付与する基本コマンド...

Ubuntuの基本設定: openssh-serverのインストールと使用

Ubuntu 17.10 での openssh-server のインストールと使用を記録します。イン...

ネイティブ JavaScript 継承方法とその長所と短所の詳細な説明

目次序文プロトタイプ継承アドバンテージ欠点コンストラクタの継承アドバンテージ欠点組み合わせ継承寄生的...

MySQL での正規表現の使用に関する詳細

目次1. はじめに2. 製品テーブルを準備する2.1 ステートメントの順序2.2 大文字と小文字の区...