ホームページ 開発ツール composer React Context Composer をカプセル化するための詳細な手順 (共有)

React Context Composer をカプセル化するための詳細な手順 (共有)

Dec 20, 2021 pm 01:57 PM

この記事は composer によって書かれたもので、React Context Composer を段階的にカプセル化する方法を紹介するチュートリアル コラムです。

React Context Composer を段階的にカプセル化するにはどうすればよいですか?

モチベーション

React の状態管理ソリューションは Redux、Mobx、Recoil など多数あります。これまで私は Redux しか経験したことがありませんでしたが、まだ少し面倒だと思います。私は通常、多くのフックを作成するため、useContext フックを備えた Context Provider を使用することを好みます。これにより、状態の分割と結合が簡単になります。ここでは、各状態管理ソリューションの長所と短所については説明しませんが、Context を使用するときに発生する多層ネストの問題に焦点を当てます。

下の図は、私が最近書いていた taro 反応フック ts プロジェクトから抽出したコードです。いくつかのグローバル状態を分割し (分割の目的は不必要な再レンダリングを減らすことです)、それらをネストしました。この書き方はコールバック地獄に支配されているような感覚を思い出させ、非常に不快です。そこで、自分で上位コンポーネントを封印し、記述上の構造を「フラット化」することを考えました。

<LoadingContext.Provider value={{ loading, setLoading }}>
  <UserDataContext.Provider value={{ name: "ascodelife", age: 25 }}>
    <ThemeContext.Provider value={"light"}>
    {/* ....more Providers as long as you want */}
    </ThemeContext.Provider>
  </UserDataContext.Provider>
</LoadingContext.Provider>
ログイン後にコピー

最も簡単な解決策

ここでは、reduceRight を使用して Provider のネストを完了する最初の解決策を簡単に作成しました。

ここで、reduce の代わりに ReduceRight が使用されている理由は、外側の層から内側の層への書き込み順序により慣れているためです。

// ContextComposer.tsx
import React from &#39;react&#39;;
type IContextComposerProps = {
  contexts: { context: React.Context<any>; value: any }[];
};
const ContextComposer: React.FC<IContextComposerProps> = ({ contexts, children }) => {
  return (
    <>
      {contexts.reduceRight((child, parent) => {
        const { context, value } = parent;
        return <context.Provider value={value}>{child}</context.Provider>;
      }, children)}
    </>
  );
};
export default ContextComposer;
// App.tsx
<ContextComposer
  contexts={[
    { context: ThemeContext, value: "light" },
    { context: UserDataContext, value: { name: "ascodelife", age: 25 } },
    { context: LoadingContext, value: { loading, setLoading } },
  ]}>
    { children }
</ContextComposer>
ログイン後にコピー

実際に体験してみると、使えるものの、開発体験は少し悪いことが分かりました。問題は、コンポーネントがパラメーターに入るときに渡される値の型が any であることです。これは、 ts の静的型チェックが放棄されていることを意味します。パラメーターを渡すとき、値に対して静的型チェックが行われないため、コードを入力するときにコード プロンプトが表示されないだけでなく、比較的低レベルのランタイム エラーが発生する可能性があります。悪いレビュー!

React.cloneElement() に基づく変換計画

#上記のスキームを変換するために、比較的不人気ではあるが使いやすい関数に注目しました— React.cloneElement().この関数について注目すべき点はそれほど多くありません。主に 3 つの入力パラメータを見てください。最初のパラメータは親要素、2 番目は親のプロパティ、3 番目は残りのパラメータ (子を除く) です。最初のパラメータ。これを除き、他のすべての値はオプションです。

例:

<!-- 调用函数 -->
React.cloneElement(<div/>,{},<span/>);
<!-- 相当于创建了这样一个结构 -->
<div> 
    <span></span>
</div>
ログイン後にコピー

次に、変換を開始しましょう。reduceRight フレームは変更されません。入力パラメータのタイプとreduceRight コールバックを変更します。

// ContextComposer.tsx
import React from &#39;react&#39;;
type IContextComposerProps = {
  contexts: React.ReactElement[];
};
const ContextComposer: React.FC<IContextComposerProps> = ({ contexts, children }) => {
  return (
    <>
      {contexts.reduceRight((child, parent) => {
        return React.cloneElement(parent,{},child);
      }, children)}
    </>
  );
};
export default ContextComposer;
// App.tsx
<ContextComposer
  contexts={[
      <ThemeContext.Provider value={"light"} />,
      <UserDataContext.Provider value={{ name: "ascodelife", age: 25 }} />,
      <LoadingContext.Provider value={{ loading, setLoading }} />,
  ]}>
    { children }
</ContextComposer>
ログイン後にコピー

変換後、パラメーターを渡すと、実際にコンポーネントを作成しているように見えます (もちろん、コンポーネントは実際に作成されますが、コンポーネント自体は仮想 Dom にレンダリングされず、実際にはレンダリングされます。クローンコピーです)。同時に、先ほど注目した値の静的型チェックの問題も解決されました。

ヒント: React.cloneElement(parent,{},child) は React.cloneElement(parent,{children:child}) と同等ですが、その理由はわかりますか?

関連リソース

ソース コードは github (https://github.com/ascodelife/react-context-provider-composer) に同期されています。

これは、npm ウェアハウス (https://www.npmjs.com/package/@ascodelife/react-context-provider-composer) にもパッケージ化されています。ぜひ体験してください。

以上がReact Context Composer をカプセル化するための詳細な手順 (共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

作曲家は何に使用されていますか? 作曲家は何に使用されていますか? Apr 06, 2025 am 12:02 AM

作曲家は、PHPの依存関係管理ツールです。 Composerを使用するコアステップは次のとおりです。1)「Stripe/Stripe-PHP」などのComposer.jsonの依存関係を宣言:「^7.0」; 2)ComposerInStallを実行して、依存関係をダウンロードおよび構成します。 3)Composer.LockおよびAutoload.phpを介してバージョンとオートロードを管理します。 Composerは依存関係管理を簡素化し、プロジェクトの効率と保守性を向上させます。

作曲家とオーケストレーターの違いは何ですか? 作曲家とオーケストレーターの違いは何ですか? Apr 02, 2025 pm 02:49 PM

作曲家はPHPプロジェクトの依存関係を管理するために使用されますが、オーケストレーターはマイクロサービスまたはコンテナ化されたアプリケーションを管理および調整するために使用されます。 1.Composer.jsonファイルを介してPHPプロジェクトの依存関係を宣言および管理します。 2。Orchestratorは、構成ファイル(KubernetesのYAMLファイルなど)を介してサービスの展開と拡張を管理し、高可用性と負荷分散を確保します。

作曲家は何をしていますか? 作曲家は何をしていますか? Apr 08, 2025 am 12:19 AM

Composerは、PHPの依存関係管理ツールであり、プロジェクトの依存関係を宣言、ダウンロード、管理するために使用されます。 1)Composer.jsonファイルを介して依存関係を宣言します。2)ComposerInstallコマンドを使用して依存関係をインストールし、3)依存関係ツリーを解析し、Packagistからダウンロードします。4)Autoload.phpファイルを生成して自動荷重を簡素化します。

作曲家の専門知識:誰かを熟練させるもの 作曲家の専門知識:誰かを熟練させるもの Apr 11, 2025 pm 12:41 PM

作曲家を使用するときに熟練するには、次のスキルをマスターする必要があります。1。composer.jsonとcomposer.lockファイルを使用するのに熟練している必要があります。2。作曲家の仕組み、3。マスターコンポーザーのコマンドラインツール、4。基本的および高度な使用法を理解します。

AndroidのComposerとは何ですか? AndroidのComposerとは何ですか? Apr 04, 2025 am 12:18 AM

ComposerはAndroidのSurfaceFlingerサービスの一部であり、最終的なディスプレイバッファーに複数のグラフィックスレイヤーを合成する責任があります。 1)グラフィックレイヤーを収集し、2)グラフィックレイヤーを並べ替え、3)グラフィックレイヤーを合成し、4)ディスプレイデバイスへの出力を使用して、アプリケーションのパフォーマンスとユーザーエクスペリエンスを向上させます。

作曲家の定義は何ですか? 作曲家の定義は何ですか? Apr 03, 2025 am 12:17 AM

作曲家は、音楽を作り、感情を表現し、物語を語り、音楽を通してアイデアを伝える人々です。作曲家の作品には次のものが含まれます。1。概念:作品のテーマとスタイルを決定します。 2。作成:メロディーとハーモニーを作曲して、予備的な音楽構造を形成します。 3。実験:機器またはソフトウェアを介した作業のオーディションと調整。 4。改善:満足するまで、オーディションの結果に従って変更および改善します。

App Composerとは何ですか? App Composerとは何ですか? Apr 07, 2025 am 12:07 AM

AppComposerは、アプリケーションを構築および管理するためのツールです。 1)事前定義されたコンポーネントをドラッグして構成することにより、アプリケーションの開発を簡素化し、効率を向上させます。 2)開発者は、コンポーネントを定義し、インターフェイスを組み合わせ、ビジネスロジックを定義し、最終的にアプリケーションをレンダリングできます。 3)タスク管理や条件付きレンダリングなど、基本的および高度な使用法をサポートし、柔軟なアプリケーションの構築に役立ちます。

作曲家AIとは何ですか? 作曲家AIとは何ですか? Apr 05, 2025 am 12:13 AM

Composeraiは、開発効率と品質を改善するためにコードを生成および最適化するための人工知能ベースのツールです。その機能には次のものが含まれます。1。コード生成:要件に応じて標準を満たすコードスニペットを生成します。 2。コード最適化:既存のコードを分析することにより、最適化の提案を行います。 3。自動テスト:テストケースを生成して、コードの品質を確保します。

See all articles