検索
ホームページウェブフロントエンドjsチュートリアルReact コンポーネントを構築する最も完全な方法

私は React を使うのがとても好きです。その最大の利点は十分にシンプルなことだと思うからです。 シンプルと簡単には違いがあります。つまり、React も簡単です。もちろん、核となる内容をマスターすれば、他のことはすべて理解できるようになるまでには時間がかかります。難しい部分については以下で説明します。

結合と凝集

これらの指標 (結合と凝集) は、プログラミングの習慣を変える上で多かれ少なかれ課題をもたらします。これらはクラスベースのオブジェクト指向プログラミングでよく使用されます。 React コンポーネントを作成するときにも、同じルールを参照して適用します。

カップリングとは、要素間の相互接続と依存関係を指します。 1 つの要素を変更し、別の要素を同期的に更新する必要がある場合、これを密結合と呼びます。疎結合とは、1 つの要素が変更されたときに、別の要素を変更する必要がないことを意味します。たとえば、銀行振込金額関数を示します。表示される金額が為替レート計算に依存している場合、内部換算構造が変更されると表示されるコードが更新されます。要素インターフェイスに基づいて疎結合システムを設計する場合、要素の変更はビュー レイヤの表示に影響しません。明らかに、疎結合コンポーネントは管理と制御が容易です。

凝集性とは、コンポーネントが 1 つのことのみを担当するかどうかです。この指標は、単一の原則と Unix の原則に従っています。つまり、1 つのことに焦点を当て、それをうまく実行します。口座残高の書式設定された表示で、関連する為替レートの計算と履歴の表示権限が利用可能かどうかの確認が必要な場合、これには多くの機能上の責任が含まれており、これらの機能は相互に依存しません。おそらく、許可の処理と為替レートは別のコンポーネントであるはずです。一方、複数のコンポーネント (整数部、小数部、通貨表示用) があり、プログラマーが残高を表示したい場合は、組み立てるすべてのコンポーネントを見つける必要があります。課題は、凝集性の高いコンポーネントを作成することです。

コンポーネントの構築

コンポーネントを作成するにはさまざまな方法があります。私たちはコンポーネントを適度な範囲で再利用できるようにしたいと考えています。また、大きなコンポーネント内で使用できる小さなコンポーネントも構築したいと考えています。理想的には、システムの管理と拡張が容易になるように、疎結合で高度に集約されたコンポーネントを構築したいと考えています。 React コンポーネントの Props は関数のパラメーターに似ており、ステートレス関数を持つコンポーネントとみなすこともできます。コンポーネント内でプロパティをどのように定義するか、またコンポーネントをどのように再利用できるかを考える必要があります。

次に、経費管理システムを背景として使用し、経費の詳細な形式を分析し、コンポーネントの構築方法を紹介します:

type Expense {
      description: string
      category: string
      amount: number
      doneAt: moment
    }

モデルによると、経費形式には次のようなプログラム モデリング方法があります。

  • 小道具はありません

  • 経費オブジェクトを渡します

  • 必要な属性を渡します

  • すべての属性のマップを渡します

  • フォーマットされたサブオブジェクトを渡します

以下について議論します上記の配送方法を使用した場合のメリットとデメリットを個別に説明します。ただし、使用シナリオや依存するシステムに応じて、上記のいずれかの方法を使用する場合は常に注意を払う必要があります。それが私たちもやっていることであり、適切に抽象的なシーンを構築します。

小道具はありません

これは最も単純な解決策であり、多くの場合、静的データを書き込むコンポーネントを構築します。

const ExpenseDetails = () => (
      <p>
         </p><p>Category: <span>Food</span></p>
         <p>Description: <span>Lunch</span></p>
         <p>Amount: <span>10.15</span></p>
         <p>Date: <span>2017-10-12</span></p>
      
    )

props を渡さないと柔軟性がなくなり、コンポーネントは 1 つのシーンでのみ使用できます。経費詳細の例では、最初にコンポーネントがいくつかの小道具を受け入れる必要があることがわかります。ただし、シナリオによっては、小道具を持たないことも良い解決策となります。まず、商標、ロゴ、会社情報など、簡単に変更できないコンテンツをプロパティに含むコンポーネントを使用できます。

const Logo = () => (
      <p>
       <img  alt="React コンポーネントを構築する最も完全な方法" >
      </p>
    )

コンポーネントをできるだけ小さく書くと、システムの保守が容易になります。情報を 1 か所に保管し、変更する必要があるのは 1 か所だけです。複数の場所に重複したコードを記述しないでください。

経費オブジェクトを渡す

経費の詳細が決定したら、データをコンポーネントに渡す必要があります。まず、経費オブジェクトを渡す必要があります。

const ExpenseDetails = ({ expense }) => (
      <p>
         </p><p>Category: <span>{expense.category}</span></p>
         <p>Description: <span>{expense.description}</span></p>
         <p>Amount: <span>{expense.amount}</span></p>
         <p>Date: <span>{expense.doneAt}</span></p>
      
    )

経費オブジェクトを経費詳細コンポーネントに渡すのは理にかなっています。経費詳細形式は一貫性が高く、経費データが表示されます。形式を変更する必要がある場合は、ここが変更できる唯一の場所です。経費詳細の形式を変更しても、経費オブジェクト自体に副作用はありません。

このコンポーネントは経費オブジェクトと密接に結合されています。これは悪いことですか?もちろんそうではありませんが、これがシステムにどのような影響を与えるかを認識する必要があります。 オブジェクトを小道具として渡すと、経費詳細コンポーネントは経費の内部構造に依存します。経費の内部構造を変更する場合は、経費詳細コンポーネントを変更する必要があります。もちろん、変更する必要があるのは 1 か所だけです。

このデザインは将来の変化にどのように適応しますか? フィールドを追加、変更、または削除する場合、変更する必要があるコンポーネントは 1 つだけです。別の書式設定されたカレンダー表示を追加する必要がある場合はどうすればよいでしょうか?カレンダーの書式設定用の新しいプロパティを追加できます。

りー

我们开始增加属性来使组件更加灵活。如果只有几个选项,那么一切都是很ok的。系统业务开始扩展后问题就来了,在不同的场景下我们需要维护大量的props。

const ExpenseDetails = ({ expense, dateFormat, withCurrency, currencyFormat, isOverdue, isPaid ... })

 

增加props可以使得组件重用性更好,但你可能设计了多重功能职责的组件。这种规则也同样在函数写法中运用。可以用多个参数来创建一个函数,当参数的数目超过3个或者4个时候,意味着这个函数在做很多事情了,也许这时候应该将函数拆成更小的函数来的更加简单。

随着组件props的增加,我们将其拆分成定义明确的组件,比如:OverdueExpenseDetails, PaidExpenseDetails等。

只传递必要的属性

为了减少对象自身的内容,我们可以只传递必要的属性值。

const ExpenseDetails = ({ category, description, amount, date }) => (
      <p>
         </p><p>Category: <span>{category}</span></p>
         <p>Description: <span>{description}</span></p>
         <p>Amount: <span>{amount}</span></p>
         <p>Date: <span>{date}</span></p>
      
    )

 

我们分别传递属性,这样我们将一部分工作责任转移给了组件使用者。如果费用的内部结构发生变化,他将不会影响费用明细的格式化。但可能影响每个使用组件的地方,因为我们可能需要修改props。当我们以独立的属性传递props时候,一个组件将更加抽象了。

只传递需要的字段对未来设计改动是如何影响的?增加、更新或者删除字段将不会很容易。无论何时我们要增加一个字段,我们不仅仅要改变费用细节的实现,也需要改变每个使用组件的地方。另外一个方面,支持多种日历格式化几乎是现成的,我们可以传递日历作为prop,也可以传递格式化后的日历。

<expensedetails></expensedetails>

 

决定如何展示特定的字段应该在掌握在具体使用组件的人手中,这将不是费用明细组件关心的内容。

传递map或者array的属性

为了达到组件抽象化,我们可以传递一个map的属性值。

const ExpenseDetails = ({ expense }) => (
      <p>
      {
        _.reduce(expense, (acc, value, key) => {
          acc.push(</p><p>{key}<span>{value}</span></p>)
        }, [])
      }
      
    )

 

使用组件的人控制费用明细的格式化,传递给组件的对象格式则必须正确。

const expense = {
      "Category": "Food",
      "Description": "Lunch",
      "Amount": 10.15,
      "Date": 2017-10-12
    }

 

这个方案有很多缺陷,我们很难控制组件展示的样式,并且展示顺序也没有指定。因此,如果我们需要某种顺序的话,可以采用array代替map来解决这个问题。但是仍然还有缺陷。

传递map 和array作为props 不与费用耦合,也根本与它不一致。增加和删除新属性虽然只改变了prop,但是我们无法控制组件本身的格式。如果我们只改变类别的格式化,这不是一个可行的办法。(确切地说,总有一个办法来解决,例如,传递另外一个格式化后的props。这个解决方案似乎不再简单了。)

传递一个格式化的子对象

我们也可以只通过直接传对一个子对象,这样就能考虑更少的组件内需要如何展示。

const ExpenseDetails = ({ children }) => (
      <p>
        { children }
      </p>
    )

 

在这种情况下,费用明细只是一个提供结构和样式的容器。展示所有信息则是使用组件的人必须提供的。

<expensedetails>
      <p>Category: <span>{expense.category}</span></p>
      <p>Description: <span>{expense.description}</span></p>
      <p>Amount: <span>{expense.amount}</span></p>
      <p>Date: <span>{expense.doneAt}</span></p>
    </expensedetails>

 

在费用明细这个案例中,我们需要重复许多工作,因此这也许不是一个好的解决方案。尽管如此,灵活性则是巨大的,因为有可能有很多不同的格式化操作。增删改只需要改变使用组件时候传入的值。日期格式也是一样的,我们虽然失去了功能内聚的特点,但这也是我们不得不付出的代价。

环境为王

正如你所看到,我们讨论了它们的不同优缺点和可能性。哪一个最好呢,这取决于:

  • 项目本身

  • 项目阶段

  • 组件自身,需要很多特殊的组件组成还是只需要简单的一些选项值

  • 自己的习惯

  • 使用环境-适合频繁的改变和被多次使用

没有一个万能的解决方案,一个方案也并不能适用所有场景。我们如何构建组件对于系统的维护和系统可扩展方面有着深远的影响。这完全依赖于组件所使用的环境。非常幸运的是,我们有很多可使用的方案。组件是功能的抽象集合,它既能构建小系统也能构建大系统。所以这仅仅只是一个选择问题。

相关推荐:

store优化React组件的方法详解

如何在React组件“外”使用父组件的Props

React组件的生命周期函数是什么

以上がReact コンポーネントを構築する最も完全な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

Python vs. JavaScript:コミュニティ、ライブラリ、リソースPython vs. JavaScript:コミュニティ、ライブラリ、リソースApr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへ:すべてがどのように機能するかC/CからJavaScriptへ:すべてがどのように機能するかApr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

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

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール