Reactにおけるコンテキスト適用シナリオの分析

Reactにおけるコンテキスト適用シナリオの分析

コンテキストの定義と目的

コンテキストは、コンポーネント ツリーにプロパティを明示的に渡すことなく、コンポーネント間でデータを共有する方法を提供します。

アプリケーション シナリオで共有する必要があるデータは何ですか?

コンテキストは、現在認証されているユーザー、テーマ、優先言語など、コンポーネントのツリーに対して「グローバル」なデータを共有するように設計されています。

使い方

1. コンテキストの作成と初期化

定数MyContext = createContext(デフォルト値);

Context オブジェクトを作成します。 React がこの Context オブジェクトをサブスクライブするコンポーネントをレンダリングすると、コンポーネントはコンポーネント ツリー内で自身に最も近い一致するProviderから現在のコンテキスト値を読み取ります。

2. コンテキストを購読する

<MyContext.Provider value={/* 何らかの値*/>

プロバイダーはvalue属性を受け取り、それを消費コンポーネントに渡します。プロバイダーは、複数のコンシューマー コンポーネントと対応する関係を持つことができます。複数のプロバイダーをネストすることもでき、その場合、内側のプロバイダーは外側のプロバイダーのデータを上書きします。

ここでは2つの関連する概念がある

  • プロバイダー - コンテキスト プロバイダー、またはコンテキストのサブスクライバー。これは、プロバイダーを通じて内部コンポーネントのコンテキスト値の変更をサブスクライブするものとして理解できます。コンテキスト値が変更されると、内部コンポーネントの再レンダリングがトリガーされます。
  • コンシューマー - コンテキスト コンシューマー (消費コンポーネント)、またはコンテキスト ユーザー。つまり、Context コンポーネントを使用または消費するには、Provider 内でuseContext()を使用します。これらのコンポーネントは、useContext() を通じて Context の最新の値を取得して使用します。

3. Conextを使用する

3.1 Reactコンポーネントでの使用

定数値 = useContext(MyContext);

消費コンポーネント内のコンテキストを参照します。 value は、コンポーネント ツリー内で自身に最も近い一致するプロバイダーから現在のコンテキスト値を読み取ります。

3.2 純粋機能コンポーネントでの使用

純粋に機能的なコンポーネントでは、 Consumerを使用してコンテキストの値を参照できます。上位層に対応するプロバイダーがない場合、 value はcreateContext()に渡されるdefaultValueと同等になります。

<MyContext.コンシューマー>
  {value => /* コンテキスト値に基づいてレンダリング */
</MyContext.Consumer>

4. コンテキストの更新

4.1 上から下へのコンテキストの更新

トップダウン更新とは、プロバイダーの値を更新することを指します。プロバイダーのvalueが変更されると、その中のすべての消費コンポーネントのuseContextを通じて取得された値が自動的に更新され、再レンダリングがトリガーされます。

//アプリ.js

// ....

デフォルト関数App()をエクスポートする{
    //...
    
    // 
    const {contextValue, setContextValue} = React.useState(initialValue);

    // コンテキスト値を更新する関数
    関数 updateContext(newValue) {
        // ...

        // contextValue、ConsumerComponent1、ConsumerComponent2、ConsumerComponent3、ConsumerComponent11 を更新すると、再レンダリングがトリガーされます。
        setContextValue(新しい値)
    }

    ...
    戻る (
        <アプリ>
            <MyContext.Provider 値 = {contextValue}>
                <コンシューマーコンポーネント1>
                    <コンシューマーコンポーネント11>
    					// ....
                    </コンシューマーコンポーネント11>
                </コンシューマーコンポーネント1>

                <コンシューマーコンポーネント2 />
                <コンシューマーコンポーネント3 />
            </MyContext.Provider>
        </アプリ>
    );
    
}

4.2 ボトムアップ(消費コンポーネントから)コンテキスト更新

場合によっては、 contextを消費コンポーネントで更新し、プログラム全体に適応させる必要があります。たとえば、アプリケーションのsettingコンポーネントを通じて UI スタイルを変更します。 このとき、コールバックを通じて更新をレイヤーごとに対応するプロバイダーに渡し、Provide に対応するvalueを更新して、関連するすべてのコンシューマー コンポーネントの更新をトリガーする必要があります。

// アプリ.js

デフォルト関数App()をエクスポートする{
    ...
    const {contextValue, setContextValue} = React.useState(initialValue);

    // コンテキスト値を更新する関数
    関数 updateContext(newValue) {
        // ...

        // contextValue、ConsumerComponent1、ConsumerComponent2、ConsumerComponent3、ConsumerComponent11 を更新すると、再レンダリングがトリガーされます。
        setContextValue(新しい値)
    }

    ...
    戻る (
        <アプリ>
            <MyContext.Provider 値 = {contextValue}>
                <コンシューマーコンポーネント1>
                    <ConsumerComponent11 updateValue={updateContext}> // コールバック プロパティを通じて ConsumerComponent11 の contextValue を更新します。contextValue は最上位レベルの Provider の値に属しているため、ConsumerComponent1、ConsumerComponent2、および ConsumerComponent3 の再レンダリングもトリガーされます。
                    </コンシューマーコンポーネント11>
                </コンシューマーコンポーネント1>

                <コンシューマーコンポーネント2 />
                <コンシューマーコンポーネント3 />
            </MyContext.Provider>
        </アプリ>
    );
}

4.3 プロバイダのネスト

場合によっては、同じコンテキストのプロバイダーがネストされ、2 つのコンテキストとして認識されることがあります。違いは、

...
React のコンテキスト値を設定します。

// コンテキスト値を更新する関数
関数 updateContext(newValue) {
    // ...
    
    // contextValue、ConsumerComponent1、ConsumerComponent2、ConsumerComponent3、ConsumerComponent11 を更新すると、再レンダリングがトリガーされます。
    setContextValue(新しい値)
}

...
戻る (
	<アプリ>
        <MyContext.Provider 値 = {contextValue}>
            <コンシューマーコンポーネント1>
                <コンシューマーコンポーネント11 />
            </コンシューマーコンポーネント1>

            <コンシューマーコンポーネント2>
                ...
                // ConsumerComponent21 と ConsumerComponent22 の値のみを更新する場合 const localContextValue = useContext(MyContext); // 上位層プロバイダーから現在の値を取得します const {tempContextValue, setTempContextValue} = React.useState(localContextValue);

				関数 updateTempContext(newValue) {
                    // ここでの更新は ConsumerComponent21 と ConsumerComponent22 の再レンダリングのみをトリガーします setTempContextValue(newValue); 
                }

				// ここで ConsumerComponent21 と ConsumerComponent22 間でデータを共有するための新しいプロバイダーを作成します。
                <MyContext.Provider 値 = {tempValue}>
                    <コンシューマーコンポーネント21>
                    	// ConsumerComponent21 で useContext(MyContext) 経由でサブスクライブします // 取得される値は、自身に最も近い一致するプロバイダーから読み取られたコンテキスト値、つまり tempValue です
                    </コンシューマーコンポーネント21>
                    <コンシューマーコンポーネント22>
                    </コンシューマーコンポーネント22>
				</MyContext.Provider 値 = {contextValue}>
            </コンシューマーコンポーネント2>
            <コンシューマーコンポーネント3 />
        </MyContext.Provider>
    </アプリ>
);

公式ドキュメント

公式ドキュメントについては、以下の基本および上級チュートリアルを参照してください。

フック API インデックス – React (reactjs.org)

コンテキスト – React (reactjs.org)

上記は、React における Context アプリケーション シナリオの分析の詳細な内容です。React における Context の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • React Contextの理解と応用についてお話ししましょう
  • Reactコンテキストを使用してvueスロット関数を実装する
  • ReactのPropsの簡単な比較
  • Reactでpropsを使用する方法と制限する方法
  • Reactの3つの主要属性におけるpropsの使用の詳細な説明
  • Reactのコンテキストとプロパティの説明

<<:  Ubuntu 18.04 に MySQL をインストールする (グラフィカル チュートリアル)

>>:  Windows 10 での MySQL 8.0 のダウンロードとインストール構成のグラフィック チュートリアル

推薦する

CentOS システムのディスク パーティションを拡張する方法

問題/障害/シナリオ/要件Eve-ng の仮想マシン OVA のハードディスクは 38G しかないた...

MySQLデータベースのロック機構の分析

同時アクセスの場合、非反復読み取りやその他の読み取り現象が発生する可能性があります。高い同時実行性に...

MySQL テーブルがロックされているかどうかを照会する方法

具体的な方法: (推奨チュートリアル:MySQLデータベース学習チュートリアル)テーブルロックの状態...

Windows で virtualenv を使用して仮想環境を作成する方法 (2 つの方法)

オペレーティング システム: windows10_x64 Python バージョン: 3.6.8仮想...

Mysql5.7.14 インストールと設定方法操作グラフィックチュートリアル(パスワード問題解決)

この記事は主に、以前のインストール方法を使用して MySQL 5.7.14 をインストールするときに...

Tomcat プロセスの CPU 使用率が高い場合のトラブルシューティング記録を記録する

この記事では主にTomcatプロセスを記録し、TCP接続が多すぎることによるCPU使用率の過剰のトラ...

セマンティック HTML タグの紹介

ここ数年、ウェブサイト開発では DIV+CSS が非常に人気があり、当時は大きな騒動を引き起こしまし...

yum 経由で CentOS に PHP をインストールするチュートリアル

まず、yumを使ってCentOSにPHPをインストールする方法を紹介します。 1. PHPのyumソ...

Centos7にnginxをインストールする方法

必要な環境をインストールする1. gccのインストールnginx をインストールするには、公式サイト...

ElementUI の this.$notify.close() 呼び出しが機能しない問題の解決方法

目次要件の説明問題の説明問題分析問題解決質問の拡張要件の説明このプロジェクトでは、まずユーザーが質問...

SpringBootをDockerにデプロイし、jarパッケージを置き換える方法の詳細な説明

目次プロジェクトディレクトリDockerファイルファイルの展開画像を生成するコンテナを起動するウェブ...

SQL文でのgroup byの使用について簡単に説明します

1. 概要Group by は、by の後の規則に従ってデータをグループ化することを意味します。いわ...

VMware CentOS 仮想マシンのインストールとネットワーク構成のグラフィックチュートリアル

1. CentOSイメージをダウンロードする1.1 ダウンロードウェブサイトhttp://mirro...

Vue3はJingdong製品詳細ページの虫眼鏡効果コンポーネントをカプセル化します

この記事では、Jingdong製品詳細ページの虫眼鏡効果コンポーネントに似たvue3カプセル化の具体...

React+Koa によるファイルアップロードの実装例

目次背景サーバーの依存関係バックエンド構成クロスドメインバックエンド構成の静的リソースアクセスではk...