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

この記事は 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 サイトの他の関連記事を参照してください。

声明
この記事はjuejinで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
作曲家:PHPプロジェクト開発の合理化作曲家:PHPプロジェクト開発の合理化Apr 15, 2025 am 12:08 AM

Composerは、PHPプロジェクトの開発手順を簡素化します。1)composer.jsonの「laravel/framework」の追加などの依存関係の追加。 2)名前空間とclassPathを定義することにより、自動的にロードし、autoload.phpファイルを生成します。 3)ComposerDump-Autoload-OおよびComposerInstallを使用して、パフォーマンスを最適化します-No-DEV-OPTIMIZE-AUTOLOADERコマンド。これらの手順を通じて、開発者はより効率的になり、一般的な間違いを回避できます。

作曲家資格情報:誰かが作曲家になっているのはなぜですか?作曲家資格情報:誰かが作曲家になっているのはなぜですか?Apr 14, 2025 am 12:13 AM

作曲家になることの重要な要素には次のものがあります。1。音楽理論の習得、2。創造的でオリジナルであること、3。技術的なスキルを持っている、4。感情を表現し、物語を語ることができる。5。文化的および歴史的背景を理解する、6。

作曲家になるための道:実用的なガイド作曲家になるための道:実用的なガイドApr 13, 2025 am 12:11 AM

作曲家になるための手順には次のものがあります。1。ノート、リズム、ハーモニー、メロディーなどの音楽の基本的な要素をマスターします。 2。abletonliveなどの適切な技術ツールを選択します。 3.インスピレーションの獲得、概念、執筆、修正、改善など、作曲のプロセスを理解する。 4.シンプルなメロディーの作成から始めて、ハーモニーなどの複雑なテクニックを徐々に試します。 5.ノート選択やリズム配置などのデバッグ技術を通じて一般的な問題を解決します。 6.テンプレートの使用、バージョン制御、コラボレーションなど、パフォーマンスの最適化とベストプラクティスを適用します。

作曲家:堅牢なPHPアプリケーションを構築するための鍵作曲家:堅牢なPHPアプリケーションを構築するための鍵Apr 12, 2025 am 12:05 AM

Composerは、依存関係管理を簡素化し、開発効率とコードの品質を向上させるため、堅牢なPHPアプリケーションを構築するための重要なツールです。 1)Composerは、Composer.jsonファイルを介してプロジェクトの依存関係を定義し、これらの依存関係を自動的にダウンロードおよび管理します。 2)composer.lockファイルを生成して、依存関係バージョンが一貫しており、ベンダー/autoload.phpを介して自動的に読み込まれていることを確認します。 3)使用の例には、ログライブラリの追加などの基本的な使用法や、バージョンの制約や環境変数管理などの高度な使用法が含まれます。 4)一般的なエラーデバッグ手法には、依存関係の競合とネットワークの問題の処理が含まれます。 5)パフォーマンス最適化の提案には、Composer.Lockファイルの使用と自動負荷の最適化が含まれます。

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

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

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

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

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

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

作曲家は何に使用されていますか?作曲家は何に使用されていますか?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は依存関係管理を簡素化し、プロジェクトの効率と保守性を向上させます。

See all articles

ホット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ヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SublimeText3 中国語版

SublimeText3 中国語版

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