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 ファイル/ディレクトリの権限と所有権の管理

推薦する

CentOS 7 で RPM を使用して mysql5.7.13 をインストールする

0. 環境この記事のオペレーティング システム: CentOS 7.2.1511 x86_64 My...

Linuxフラッシュのインストール方法

Linuxにフラッシュをインストールする方法1. Flashの公式サイトにアクセスし、ダウンロードを...

vue3 統合 API における vue2 の $refs の代替方法についての簡単な説明

vue2 プロジェクト開発の経験があれば、$refs に精通しているでしょう。 vue3 の急激なア...

読み取り専用と無効の微妙な違いの詳細な説明

「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにします...

Linux環境にDocker環境をインストールする(落とし穴なし)

目次インストールの前提条件ステップ1: システムの残りを確認してクリアし、Dockerの依存関係をイ...

ウェブページの右側に固定されたフローティングレイヤーの実装コード

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

MySql の知識ポイント: トランザクション、インデックス、ロックの原則、使用状況の分析

この記事では、トランザクション、インデックス、ロックなどの MySQL の知識ポイントの原理と使用法...

Linux で txt を mysql にインポートする方法

序文昨日、小さなプロジェクトを書いていたときに、txt ドキュメントのデータを mysql データベ...

Nginx 500 内部サーバーエラーの解決方法

今日、Nginxを使っていたら500エラーが発生しました。エラーコードを検索してみんなに共有しました...

MySql でメモリ使用量を削減する方法の詳細な説明

序文デフォルトでは、MySQL はデータベース クエリ データをキャッシュするために大きなメモリ ブ...

NodeとPythonの双方向通信実装コード

目次プロセスコミュニケーションプロセス間の双方向通信問題要約するサードパーティのデータ サプライヤー...

JavaScriptは検証コードと検証のランダム生成を実装します

この記事では、検証コードのランダム生成と検証を実現するためのJavaScriptの具体的なコードを参...

VUEはG2チャートを使用した実装を導入します

目次G2チャートについて使用テンプレートで使用される完全なコード (棒グラフ)世界地図を追加するG2...

モバイル端末のジャンプ問題を解決する(CSS遷移、ターゲット疑似クラス)

序文モバイル端末に触れたばかりの友人の多くは、クリックジャンプルーティング、特にVueルーティングを...

Docker を使用した RabbitMQ 環境のデプロイの詳細な紹介

前提条件: Dockerはすでにインストールされています1. 画像を見つける(方法は2つあります) ...