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 のダウンロードとインストール構成のグラフィック チュートリアル

推薦する

Dockerはプライベートライブラリイメージを完全に削除します

まず、インターネット上の一般的な慣行を見てみましょうデフォルトでは、プライベート ライブラリはイメー...

MySQLに絵文字表現を保存する詳細な手順

原因: java.sql.SQLException: 列の文字列値が正しくありません: '\...

MySQLデータベースのスケジュールバックアップを実装する方法

1. シェルスクリプトを作成する vim バックアップdb.sh 次のようにスクリプトを作成します。...

iframe に関するいくつかの発見と考察

この物語は、今日の予期せぬ発見から始まります。同社には複数のウェブサイトがある。友達リンクにはお互い...

MySQL でコマンドを使用して階層検索を実現する方法の詳細な説明

序文この記事は主にMySQLコマンド階層検索ヘルプの使用に関する内容を紹介します。この記事のサンプル...

DockerにRedisをインストールし、パスワードを設定して接続する方法

Redis は分散キャッシュ サービスです。キャッシュは、大規模システムの開発やパフォーマンスの最適...

MysqlクエリJSON結果に関連する関数の概要

JSON 形式のフィールドは、MySQL 5.7 で追加された新しい属性ですが、基本的には文字列とし...

JavaScript オブジェクト指向クラス継承ケースの説明

1. オブジェクト指向のクラス継承これまでの章では、JavaScript のオブジェクト モデルがプ...

Angular構造ディレクティブモジュールとスタイルの詳細な説明

目次1. 構造指示モジュールforRoot()を書く3. スタイルの定義ドラッグ時の順序を調整するに...

React Hook の使用例 (一般的なフック 6 つ)

1. useState: 関数コンポーネントに状態を持たせる使用例: // カウンター impor...

Linux の EXT シリーズファイルシステムフォーマットの詳細な説明

Linux ファイルシステム一般的なハードディスクは上図のとおりです。各ディスクは複数のトラックに分...

Vueの子コンポーネントと親コンポーネントの詳細な分析

目次1. 親コンポーネントと子コンポーネント2. テンプレート分離書き込み1. テンプレートタグ2....

インストールされていないバージョンの MySQL を使用する手順とパスワードを忘れた場合の解決策

最初のステップは、圧縮されたパッケージを対応するディスクに解凍することです。 2 番目の手順は、cm...

MySQL 8のパスワードを忘れた場合のベストな対処法の簡単な分析

序文MySQL に精通している読者は、MySQL が非常に迅速に更新されることに気付くかもしれません...

Apple の携帯電話のロックを解除するときに光沢のあるフォント効果を実現するために CSS3 を使用する例

0. はじめに2016 年 8 月 18 日 今日、iPhone をスライドさせてロックを解除すると...