ホームページ ウェブフロントエンド jsチュートリアル React の高次コンポーネントの分析例

React の高次コンポーネントの分析例

May 26, 2018 am 11:51 AM
react 解析する

この記事では主に React の高次コンポーネントについて詳しく説明します。React の高次コンポーネントについてより明確に理解していただければ幸いです。

1. React では、高次コンポーネント (HOC) はコンポーネント ロジックを再利用するための高度なテクノロジです。 HOC は React API の一部ではありません。 HOC は、コンポーネントを取得して新しいコンポーネントを返す関数です。 React では、コンポーネントはコード再利用の基本単位です。

2. HOC を説明するために、次の 2 つの例を取り上げます。

CommentList コンポーネントはコメント リストをレンダリングし、リスト内のデータは外部ソースから取得されます。

class CommentList extends React.Component {

  constructor() {

   super();

   this.handleChange = this.handleChange.bind(this);

   this.state = {

    // "DataSource" is some global data source

    comments: DataSource.getComments()

   };

  }

 

  componentDidMount() {

   // Subscribe to changes

   DataSource.addChangeListener(this.handleChange);

  }

 

  componentWillUnmount() {

   // Clean up listener

   DataSource.removeChangeListener(this.handleChange);

  }

 

  handleChange() {

   // Update component state whenever the data source changes

   this.setState({

    comments: DataSource.getComments()

   });

  }

 

  render() {

   return (

    <p>

     {this.state.comments.map((comment) => (

      <Comment comment={comment} key={comment.id} />

     ))}

    </p>

   );

  }

 }
ログイン後にコピー

次は、ブログ情報を表示するために使用される BlogPost コンポーネントです

class BlogPost extends React.Component {

  constructor(props) {

   super(props);

   this.handleChange = this.handleChange.bind(this);

   this.state = {

    blogPost: DataSource.getBlogPost(props.id)

   };

  }

 

  componentDidMount() {

   DataSource.addChangeListener(this.handleChange);

  }

 

  componentWillUnmount() {

   DataSource.removeChangeListener(this.handleChange);

  }

 

  handleChange() {

   this.setState({

    blogPost: DataSource.getBlogPost(this.props.id)

   });

  }

 

  render() {

   return <TextBlock text={this.state.blogPost} />;

  }

 }
ログイン後にコピー

2 つのコンポーネントは異なり、DataSource の異なるメソッドを呼び出し、出力も異なりますが、それらの間の実装はほとんど同じです:

1. 読み込みが完了したら、DataSource に変更リスナーを追加します
2. データソースが変更された場合、リスナー内で setState を呼び出します
3. アンインストール後、変更リスナーを削除します

アプリケーションでは、DataSource にアクセスして setState を呼び出すという同じパターンが何度も発生します。このプロセスを抽象化して、このロジックを 1 か所でのみ定義し、複数のコンポーネント間で共有できるようにしたいと考えています。

次に、コンポーネントを作成する関数を作成します。この関数は 2 つのパラメーターを受け取ります。1 つはコンポーネントで、もう 1 つは関数です。 withSubscription 関数は以下で呼び出されます

const CommentListWithSubscription = withSubscription(

 CommentList,

 (DataSource) => DataSource.getComments()

);

 

const BlogPostWithSubscription = withSubscription(

 BlogPost,

 (DataSource, props) => DataSource.getBlogPost(props.id)

);
ログイン後にコピー

withSubscription を呼び出すときに渡される最初のパラメーターはラップされたコンポーネントで、2 番目のパラメーターはデータを取得するために使用される関数です。

CommentListWithSubscription と BlogPostWithSubscription がレンダリングされるとき、CommentList と BlogPost は、DataSource から現在取得されているデータを保存する data と呼ばれる prop を受け入れます。 withSubscription コードは次のとおりです:

// This function takes a component...

function withSubscription(WrappedComponent, selectData) {

 // ...and returns another component...

 return class extends React.Component {

  constructor(props) {

   super(props);

   this.handleChange = this.handleChange.bind(this);

   this.state = {

    data: selectData(DataSource, props)

   };

  }

 

  componentDidMount() {

   // ... that takes care of the subscription...

   DataSource.addChangeListener(this.handleChange);

  }

 

  componentWillUnmount() {

   DataSource.removeChangeListener(this.handleChange);

  }

 

  handleChange() {

   this.setState({

    data: selectData(DataSource, this.props)

   });

  }

 

  render() {

   // ... and renders the wrapped component with the fresh data!

   // Notice that we pass through any additional props

   return <WrappedComponent data={this.state.data} {...this.props} />;

  }

 };

}
ログイン後にコピー

HOC は入力コンポーネントを変更せず、その動作を再利用するために継承を使用しません。 HOC は単なる関数です。ラップされたコンポーネントは、コンテナーのすべての props を受け入れます。また、ラップされたコンポーネントの出力をレンダリングするために使用される新しい props (データ) も受け入れます。 HOC はデータがどのように使用されるか、データが使用される理由を気にしません。また、ラップされたコンポーネントはデータがどこで取得されるかを気にしません。

withSubscription は単なる通常の関数であるため、パラメーターはいくつでも追加できます。たとえば、データ プロップの名前を構成可能にして、ラップされたコンポーネントから HOC をさらに分離することができます。

構成 shouldComponentUpdate を受け入れるか、データ ソースのパラメーターを構成します

上位コンポーネントを使用するときに注意する必要があることがいくつかあります。

1. 元のコンポーネントを変更しないでください。これは非常に重要です

以下の例があります:

function logProps(InputComponent) {

 InputComponent.prototype.componentWillReceiveProps = function(nextProps) {

  console.log(&#39;Current props: &#39;, this.props);

  console.log(&#39;Next props: &#39;, nextProps);

 };

 // The fact that we&#39;re returning the original input is a hint that it has

 // been mutated.

 return InputComponent;

}

 

// EnhancedComponent will log whenever props are received

const EnhancedComponent = logProps(InputComponent);
ログイン後にコピー

ここにはいくつかの問題があります。 1. インポートされたコンポーネントは、拡張コンポーネントとは別に再利用できません。 2. EnhancedComponent に他の HOC を適用すると、componentWillReceiveProps も変更されます。

関数型コンポーネントにはライフサイクルがないため、この HOC は関数型コンポーネントには適用できません。関数 HOC は、入力コンポーネントをコンテナー コンポーネントにラップすることにより、変更ではなく合成を使用する必要があります。

function logProps(WrappedComponent) {

 return class extends React.Component {

  componentWillReceiveProps(nextProps) {

   console.log(&#39;Current props: &#39;, this.props);

   console.log(&#39;Next props: &#39;, nextProps);

  }

  render() {

   // Wraps the input component in a container, without mutating it. Good!

   return <WrappedComponent {...this.props} />;

  }

 }

}
ログイン後にコピー

この新しい logProps は古い logProps と同じ機能を持ちますが、新しい logProps は潜在的な競合を回避します。クラス型コンポーネントや関数型コンポーネントも同様です。

2. render メソッドで HOC を使用しないでください

React の差分アルゴリズムは、コンポーネントの ID を使用して、レンダーから返された場合に既存のサブツリーを更新するか、古いサブツリーを破棄して新しいサブツリーをロードするかを決定します。メソッド コンポーネントが以前にレンダリングされたコンポーネントと同一 (===) の場合、React は diff アルゴリズムを通じて以前にレンダリングされたコンポーネントを更新します。そうでない場合、以前にレンダリングされたサブツリーは完全にアンロードされます。

render() {

 // A new version of EnhancedComponent is created on every render

 // EnhancedComponent1 !== EnhancedComponent2

 const EnhancedComponent = enhance(MyComponent);

 // That causes the entire subtree to unmount/remount each time!

 return <EnhancedComponent />;

}
ログイン後にコピー

結果のコンポーネントが 1 回だけ作成されるように、コンポーネント定義の外で HOC を使用します。場合によっては、HOC を動的に適用する必要があります。これはライフサイクル関数またはコンストラクターで行う必要があります

3. 静的メソッドは手動でコピーする必要があります

の React コンポーネントで静的メソッドを定義すると非常に便利な場合があります。 HOC をコンポーネントに適用すると、元のコンポーネントはコンテナ コンポーネントにラップされますが、返される新しいコンポーネントには元のコンポーネントの静的メソッドが含まれません。

// Define a static method

WrappedComponent.staticMethod = function() {/*...*/}

// Now apply an HOC

const EnhancedComponent = enhance(WrappedComponent);

 

// The enhanced component has no static method

typeof EnhancedComponent.staticMethod === &#39;undefined&#39; // true
ログイン後にコピー

返されたコンポーネントが元のコンポーネントの静的メソッドを持つようにするには、元のコンポーネントの静的メソッドを関数内の新しいコンポーネントにコピーする必要があります。


function enhance(WrappedComponent) {

 class Enhance extends React.Component {/*...*/}

 // Must know exactly which method(s) to copy :(

  // 你也能够借助第三方工具

 Enhance.staticMethod = WrappedComponent.staticMethod;

 return Enhance;

}
ログイン後にコピー

4. コンテナコンポーネントの ref はラップされたコンポーネントに渡されません

コンテナコンポーネントの props はラップされたコンポーネントに簡単に渡せますが、コンテナコンポーネントの ref は渡されませんラップされたコンポーネントに。 HOC を通じて返されるコンポーネントの ref を設定する場合、この ref はラップされたコンポーネントではなく、最も外側のコンテナ コンポーネントを参照します。

関連する推奨事項

Reactの高次コンポーネント導入例の共有

Vueの高次コンポーネントの使い方

とても簡単な例を使ってreact.jsの高次コンポーネントの考え方を理解する

以上がReact の高次コンポーネントの分析例の詳細内容です。詳細については、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)

Oracle エラー 3114 の詳細な説明: 迅速に解決する方法 Oracle エラー 3114 の詳細な説明: 迅速に解決する方法 Mar 08, 2024 pm 02:42 PM

Oracle エラー 3114 の詳細な説明: 迅速に解決する方法、具体的なコード例が必要です Oracle データベースの開発および管理中に、さまざまなエラーが頻繁に発生しますが、その中でもエラー 3114 は比較的一般的な問題です。エラー 3114 は通常、データベース接続に問題があることを示します。これは、ネットワーク障害、データベース サービスの停止、または不適切な接続文字列設定が原因である可能性があります。この記事では、エラー 3114 の原因とこの問題を迅速に解決する方法を詳しく説明し、特定のコードを添付します

PHPにおけるmidpointの意味と使い方の分析 PHPにおけるmidpointの意味と使い方の分析 Mar 27, 2024 pm 08:57 PM

【PHPにおけるミッドポイントの意味と使い方の分析】 PHPでは、ミッドポイント(.)は2つの文字列やオブジェクトのプロパティやメソッドを接続するためによく使われる演算子です。この記事では、PHP における中間点の意味と使用法を詳しく掘り下げ、具体的なコード例を示して説明します。 1. 文字列中間点演算子の接続 PHP での最も一般的な使用法は、2 つの文字列を接続することです。 2 つの文字列の間に . を置くと、それらをつなぎ合わせて新しい文字列を形成できます。 $string1=&qu

PHP、Vue、React: 最適なフロントエンド フレームワークを選択するには? PHP、Vue、React: 最適なフロントエンド フレームワークを選択するには? Mar 15, 2024 pm 05:48 PM

PHP、Vue、React: 最適なフロントエンド フレームワークを選択するには?インターネット技術の継続的な発展に伴い、フロントエンド フレームワークは Web 開発において重要な役割を果たしています。 PHP、Vue、React は 3 つの代表的なフロントエンド フレームワークであり、それぞれに独自の特徴と利点があります。使用するフロントエンド フレームワークを選択するとき、開発者はプロジェクトのニーズ、チームのスキル、個人の好みに基づいて情報に基づいた決定を下す必要があります。この記事では、PHP、Vue、React の 3 つのフロントエンド フレームワークの特徴と用途を比較します。

解析ワームホール NTT: あらゆるトークンのオープン フレームワーク 解析ワームホール NTT: あらゆるトークンのオープン フレームワーク Mar 05, 2024 pm 12:46 PM

Wormhole は、ブロックチェーンの相互運用性のリーダーであり、所有権、制御、許可のないイノベーションを優先する、回復力があり、将来性のある分散システムの作成に重点を置いています。このビジョンの基盤は、技術的専門知識、倫理原則、コミュニティの連携への取り組みであり、シンプルさ、明確さ、そして幅広いマルチチェーン ソリューションで相互運用性の状況を再定義します。ゼロ知識証明、スケーリング ソリューション、機能豊富なトークン標準の台頭により、ブロックチェーンはより強力になり、相互運用性の重要性がますます高まっています。この革新的なアプリケーション環境では、新しいガバナンス システムと実用的な機能が、ネットワーク全体の資産に前例のない機会をもたらします。プロトコル構築者は現在、この新たなマルチチェーンでどのように運用するかに取り組んでいます。

Java フレームワークとフロントエンド React フレームワークの統合 Java フレームワークとフロントエンド React フレームワークの統合 Jun 01, 2024 pm 03:16 PM

Java フレームワークと React フレームワークの統合: 手順: バックエンド Java フレームワークをセットアップします。プロジェクト構造を作成します。ビルドツールを設定します。 React アプリケーションを作成します。 REST API エンドポイントを作成します。通信メカニズムを構成します。実際のケース (SpringBoot+React): Java コード: RESTfulAPI コントローラーを定義します。 React コード: API によって返されたデータを取得して表示します。

Win11の新機能分析:Microsoftアカウントへのログインをスキップする方法 Win11の新機能分析:Microsoftアカウントへのログインをスキップする方法 Mar 27, 2024 pm 05:24 PM

Win11 の新機能の分析: Microsoft アカウントへのログインをスキップする方法 Windows 11 のリリースにより、多くのユーザーは、Windows 11 がより便利で新しい機能をもたらしたことに気づきました。ただし、ユーザーによっては、自分のシステムが Microsoft アカウントに関連付けられることを好まず、この手順をスキップしたい場合があります。この記事では、ユーザーが Windows 11 で Microsoft アカウントへのログインをスキップし、よりプライベートで自律的なエクスペリエンスを実現するのに役立ついくつかの方法を紹介します。まず、一部のユーザーが Microsoft アカウントにログインすることに抵抗がある理由を理解しましょう。一方で、一部のユーザーは次のことを心配しています。

Apache2 は PHP ファイルを正しく解析できません Apache2 は PHP ファイルを正しく解析できません Mar 08, 2024 am 11:09 AM

スペースの制限のため、以下は簡単な記事です。Apache2 は一般的に使用されている Web サーバー ソフトウェアであり、PHP は広く使用されているサーバー側スクリプト言語です。 Web サイトを構築する過程で、Apache2 が PHP ファイルを正しく解析できず、PHP コードの実行が失敗するという問題が発生することがあります。この問題は通常、Apache2 が PHP モジュールを正しく構成していないこと、または PHP モジュールが Apache2 のバージョンと互換性がないことが原因で発生します。この問題を解決するには通常 2 つの方法があります。1 つは次のとおりです。

XML 解析用の Java ライブラリの比較: 最適なソリューションを見つける XML 解析用の Java ライブラリの比較: 最適なソリューションを見つける Mar 09, 2024 am 09:10 AM

はじめに XML (Extensible Markup Language) は、データを保存および送信するための一般的な形式です。 Java での XML の解析は、データ交換からドキュメント処理に至るまで、多くのアプリケーションにとって必要なタスクです。 XML を効率的に解析するために、開発者はさまざまな Java ライブラリを使用できます。この記事では、開発者が情報に基づいた選択を行えるよう、機能、機能、パフォーマンスに焦点を当てて、最も人気のある XML 解析ライブラリのいくつかを比較します。 DOM (Document Object Model) 解析ライブラリ JavaXMLDOMAPI: Oracle が提供する標準 DOM 実装。開発者が XML ドキュメントにアクセスして操作できるようにするオブジェクト モデルを提供します。 DocumentBuilderFactoryfactory=D

See all articles