Reactでコンポーネントがどのように通信するかの詳細な説明

Reactでコンポーネントがどのように通信するかの詳細な説明

1. 何ですか

コンポーネント間の通信は、次の 2 つの単語に分けることができます。

  • コンポーネント
  • コミュニケーション

Vueシリーズの記事を振り返ると、コンポーネントはvueの最も強力な機能の1つであり、コンポーネント化はReact

vueと比較すると、 Reactコンポーネントはより柔軟で多様であり、さまざまな方法で多くの種類のコンポーネントに分割できます。

通信とは、特定の目的を達成するために、送信者が特定の媒体を介して特定の形式で受信者に情報を送信するプロセスを指します。広い意味では、あらゆる情報トラフィックは通信です。

コンポーネント間の通信とは、コンポーネントが特定の目的を達成するために何らかの方法で情報を送信することを意味します。

2. コミュニケーションの方法

コンポーネントを転送する方法は多数あり、送信者と受信者に応じて次のように分けられます。

  • 親コンポーネントから子コンポーネントへの受け渡し
  • 子コンポーネントが親コンポーネントに渡される
  • 兄弟コンポーネント間の通信
  • 親コンポーネントから子孫コンポーネントへの受け渡し
  • 非リレーショナルコンポーネント転送

親コンポーネントから子コンポーネントへの受け渡し

Reactのデータフローは一方向なので、親コンポーネントから子コンポーネントに渡すのが最も一般的な方法です。

親コンポーネントが子コンポーネントを呼び出すときは、子コンポーネントタグでパラメータを渡すだけでよく、子コンポーネントはprops属性を通じて親コンポーネントから渡されたパラメータを受け取ることができます。

関数 EmailInput(props) {
  戻る (
    <ラベル>
      メールアドレス: <input value={props.email} />
    </ラベル>
  );
}

定数要素 = <EmailInput email="[email protected]" />;

子コンポーネントが親コンポーネントに渡される

子コンポーネントと親コンポーネントの通信の基本的な考え方は、親コンポーネントが子コンポーネントに関数を渡し、この関数のコールバックを通じて子コンポーネントから渡された値を取得することです。

親コンポーネントの対応するコードは次のとおりです。

ParentsクラスはComponentを拡張します{
  コンストラクタ() {
    素晴らしい();
    この状態 = {
      価格: 0
    };
  }

  アイテム価格を取得する(e) {
    this.setState({
      価格:
    });
  }

  与える() {
    戻る (
      <div>
        <div>価格: {this.state.price}</div>
        {/* 子コンポーネントに関数を渡す*/
        <子 getPrice={this.getItemPrice.bind(this)} />
      </div>
    );
  }
}

サブコンポーネントの対応するコードは次のとおりです。

クラスChildはComponentを拡張します{
  クリックグッズ(e) {
    // この関数に値を渡します this.props.getPrice(e);
  }

  与える() {
    戻る (
      <div>
        <button onClick={this.clickGoods.bind(this, 100)}>商品1</button>
        <button onClick={this.clickGoods.bind(this, 1000)}>商品2</button>
      </div>
    );
  }
}

兄弟コンポーネント間の通信

兄弟コンポーネント間でデータが転送される場合、親コンポーネントはデータの相互通信を実現するための中間層として機能します。

クラス Parent は React.Component を拡張します {
  コンストラクタ(props) {
    スーパー(小道具)
    this.state = {count: 0}
  }
  setCount = () => {
    this.setState({count: this.state.count + 1})
  }
  与える() {
    戻る (
      <div>
        <兄弟A
          カウント = {this.state.count}
        />
        <兄弟B
          onClick={this.setCount}
        />
      </div>
    );
  }
}

親コンポーネントから子孫コンポーネントへの受け渡し

グローバル データと同様に、親コンポーネントが子孫コンポーネントにデータを渡すことはよくあります。

contextを使用すると、コンポーネントが相互に通信できるようになり、データを共有したり、他のデータが対応するデータを読み取ったりできるようになります。

React.createContextを使用してcontextを作成する

 const PriceContext = React.createContext('price')

contextが正常に作成されると、その下にProviderコンポーネントが存在し、データ ソースが作成され、 Consumerコンポーネントがデータの受信に使用されます。使用例は次のとおりです。

Providerコンポーネントは、 value属性を使用して、子孫コンポーネントにデータを渡します。

<PriceContext.Provider 値 = {100}>
</価格コンテキスト.プロバイダー>

Providerによって渡されたデータを取得する場合は、 Consumerコンポーネントを介してデータを受信するか、 contextTypeプロパティを使用します。その方法は次のとおりです。

クラスMyClassはReact.Componentを拡張します{
  静的コンテキストタイプ = PriceContext;
  与える() {
    価格を this.context とします。
    /* この値に基づいてレンダリングを実行します*/
  }
}

消費者コンポーネント:

<価格コンテキスト.消費者>
    { /* これは関数です */ }
    {
        価格 => <div>価格:{price}</div>
    }
</PriceContext.Consumer>

非リレーショナルコンポーネント転送

コンポーネント間の関係が複雑な場合は、 reduxなどのグローバルリソースとしてデータを管理し、通信を実現することをお勧めします。 reduxの使用については後で詳しく説明します

結論

React一方向のデータフローであるため、基本的な考え方は、コンポーネントは受信したデータを変更せず、データの変更のみをリッスンすることです。データが変更されると、既存の値を変更するのではなく、受信した新しい値を使用します。

したがって、通信プロセス中に、データの保存場所は親の場所に保存されることがわかります。

React におけるコンポーネント間の通信方法についてはこれで終わりです。React コンポーネント間の通信の詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • React親子コンポーネント通信実装方法
  • Reactにおけるネストされたコンポーネントとネストされたコンポーネント間の通信プロセス
  • Reactコンポーネント通信の例
  • コンポーネント間の内部通信のReactデータ転送方法
  • Reactにおけるコンポーネント通信のいくつかの方法の詳細な説明
  • Reactにおけるコンポーネント通信の詳細な説明

<<:  MySQL 8.0.17 インストール グラフィック チュートリアル

>>:  Linux ファイル/ディレクトリの権限と所有権の管理

推薦する

外部キー制約を持つテーブルデータを削除する MySQL メソッドの紹介

MySQLでテーブルやデータを削除する場合、 [エラー] 1451 - 親行を削除または更新できませ...

Manjaro インストール CUDA 実装チュートリアル分析

昨年末、Thinkpad T450 のデュアルシステムの opensuse を Manjaro に置...

MySQL の高度な機能 - データ テーブル パーティショニングの概念とメカニズムの詳細な説明

目次パーティション分割メカニズムSELECTクエリINSERT操作DELETE操作更新操作パーティシ...

MySQL 完全折りたたみクエリ正規マッチングの詳細な説明

概要前の章では、クエリのフィルター条件について学習しました。MySQL では、like % ワイルド...

Linux での MySQL 5.6.27 インストール チュートリアル

この記事では、LinuxでのMySQL 5.6.27のインストールチュートリアルを参考までに紹介しま...

CocosCreatorでWeChatゲームを作成する方法

目次1. WeChatパブリックプラットフォームからWeChat開発者ツールをダウンロードする2. ...

Win7x64でのMySQL 5.7.18解凍版のインストール方法

関連記事: Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールする...

Reactはルーティングを使用してログインインターフェースにリダイレクトします

前回の記事では、webpack と react 環境を設定した後、ログイン インターフェースとその後...

Vue コンポーネント (Vuex を含む) 間の値の転送に関する簡単な説明

目次父から息子へ:息子から父へ: Vuex を使用せずにコンポーネント間で値を渡す方法は、親から子、...

Baota Linux パネル コマンド リスト

目次Pagodaをインストールする管理塔Nginx サービス管理Apache サービス管理MySQL...

MySQL innodb例外の修復に関する経験の共有

テスト用の MySQL ライブラリのセット。以前使用されていたバージョンは、centos6 のデフォ...

HTML タグの表示モード (ブロックレベル タグ、インライン タグ、インライン ブロック タグ) に関する簡単な説明

今日の講義では、HTML におけるタグの表示モードについてお話ししましたが、これはブロックレベルタグ...

Linux ベースの MySQL マスター スレーブ構成の全プロセスを記録する

mysql マスタースレーブ構成1. 準備ホスト: 192.168.244.128スレーブ: 192...

MYSQL メタデータ ロック (MDL ロック) MDL ロックの問題分析

1. はじめにMYSQL の MDL ロックは常に頭痛の種でした。ロックについて話すとき、通常は I...

MYSQL updatexml() 関数のエラーインジェクション分析

まず、updatexml()関数を理解する UPDATEXML (XML ドキュメント、XPath ...