検索
ホームページウェブフロントエンドjsチュートリアルReact の高度なコンポーネントとは何ですか? React の高度なコンポーネントの詳細な説明

この記事では、React の高度なコンポーネントとは何ですか? React の高度なコンポーネントの詳細な説明は、必要としている友人が参考にできることを願っています。

1. 基本概念

高度な関数は、関数をパラメータとして受け取り、関数を返す関数です。同様に、高次コンポーネント (略して HOC) は React コンポーネントをパラメーターとして受け取り、新しい React コンポーネントを返します。高次コンポーネントは本質的にはコンポーネントではなく関数です。上位コンポーネントの関数形式は次のとおりです。

const EnhanceComponent = higherOrderComponent(WrappedComponent)

上位コンポーネントがどのように再利用されるかを簡単な例で説明します。ここには、LocalStorage からデータを取得してインターフェイスにレンダリングする必要があるコンポーネント MyComponent があります。通常の状況では、次のように実装できます。

import React, { Component } from 'react'

class MyComponent extends Component {
  componentWillMount() {
    let data = localStorage.getItem('data');
    this.setState({data});
  }
  render() {
    return(
      <div>{this.state.data}</div>
    )
  }
}

コードは非常に単純ですが、他のコンポーネントも LocalStorage から同じデータを取得して表示する必要がある場合、各コンポーネントは、componentWillMount のコードを書き直す必要があります。これは明らかに非常に冗長です。高次コンポーネントを使用してコードのこの部分を書き直す方法を見てみましょう。

import React, { Component } from 'react'

function withPersistentData(WrappedComponent) {
  return class extends Component {
    componentWillMount() {
      let data = localStorage.getItem('data');
      this.setState({data});
    }
    render() {
      // 通过{ ...this.props} 把传递给当前组件属性继续传递给被包装的组件
      return <wrappedcomponent></wrappedcomponent>
    }
  }
}

class MyComponent extends Component{
  render() {
    return <p>{this.props.data}</p>
  }
}

const MyComponentWithPersistentData = withPersistentData(MyComponent);

withPersistentData は、新しいコンポーネントを返す上位コンポーネントです。新しいコンポーネントでは、componentWillMount が LocalStorage からデータを取得するロジックを処理し、取得したデータを WrappedComponent を通じてパッケージ化されたコンポーネントに渡します。これにより、WrappedComponent で this.props.data を直接使用して、表示する必要があるデータを取得できるようになります。他のコンポーネントでもこのロジックが必要な場合は、引き続き上位コンポーネント withPersistentData を使用してこれらのコンポーネントをラップします。

2. 使用シナリオ

上位コンポーネントの使用シナリオには主に次の 4 つが含まれます:
1) props の操作
2) ref を介したコンポーネント インスタンスへのアクセス
3) コンポーネントのステータスの改善
4) コンポーネントを他の要素でラップする

1. props を操作する

ラップされたコンポーネントが props を受け取る前に、上位コンポーネントが最初に props をインターセプトし、props を追加することができます。 、操作を削除または変更し、処理された props をラップされたコンポーネントに渡します。1 の例は、この状況に属します。

2. ref を介してコンポーネント インスタンスにアクセスする

上位コンポーネント ref は、パッケージ化されたコンポーネント インスタンスの参照を取得し、上位コンポーネントはプロパティを直接操作する機能を持ちます。またはパッケージ化されたコンポーネントのメソッド。

import React, { Component } from 'react'

function withRef(wrappedComponent) {
  return class extends Component{
    constructor(props) {
      super(props);
      this.someMethod = this.someMethod.bind(this);
    }

    someMethod() {
      this.wrappedInstance.comeMethodInWrappedComponent();
    }

    render() {
      // 为被包装组件添加 ref 属性,从而获取组件实例并赋值给 this.wrappedInstance
      return <wrappedcomponent> { this.wrappedInstance = instance }} {...this.props}/>
    }
  }
}</wrappedcomponent>

wrapComponent がレンダリングされると、ref のコールバック関数が実行され、上位コンポーネントは this.wrappedInstance を通じて WrappedComponent インスタンスの参照を保存し、someMethod の this.wrappedInstance を通じて WrappedComponent 内のメソッドを呼び出します。この使用法が実際のプロジェクトで使用されることはほとんどありませんが、上位コンポーネントによってカプセル化された再利用ロジックを、パッケージ化されたコンポーネントのメソッドまたはプロパティによって共同でサポートする必要がある場合に便利です。

3. コンポーネントの状態の改善

上位コンポーネントは、パッケージ化されたコンポーネントの状態と、それに対応する状態処理メソッドを上位コンポーネント自体に昇格させることで、パッケージ化されたコンポーネントのステートレス性を実現できます。典型的なシナリオは、高次コンポーネントを使用して、元々制御されていたコンポーネントが維持する必要がある状態を高次コンポーネントに統合することです。

import React, { Component } from 'react'

function withRef(wrappedComponent) {
  return class extends Component{
    constructor(props) {
      super(props);
      this.state = {
        value: ''
      }
      this.handleValueChange = this.handleValueChange.bind(this);
    }

    handleValueChange(event) {
      this.this.setState({
        value: event.EventTarget.value
      })
    }

    render() {
      // newProps保存受控组件需要使用的属性和事件处理函数
      const newProps = {
        controlledProps: {
          value: this.state.value,
          onChange: this.handleValueChange
        }
      }
      return <wrappedcomponent></wrappedcomponent>
    }
  }
}

この例では、制御コンポーネントの value 属性と、値の変更を処理するコールバック関数によって使用される状態を上位コンポーネントにアップグレードします。制御コンポーネントを再度使用する場合は、次のように使用できます。

import React, { Component } from 'react'

function withControlledState(wrappedComponent) {
  return class extends Component{
    constructor(props) {
      super(props);
      this.state = {
        value: ''
      }
      this.handleValueChange = this.handleValueChange.bind(this);
    }

    handleValueChange(event) {
      this.this.setState({
        value: event.EventTarget.value
      })
    }

    render() {
      // newProps保存受控组件需要使用的属性和事件处理函数
      const newProps = {
        controlledProps: {
          value: this.state.value,
          onChange: this.handleValueChange
        }
      }
      return <wrappedcomponent></wrappedcomponent>
    }
  }
}


class  SimpleControlledComponent extends React.Component {
  render() {
    // 此时的 SimpleControlledComponent 为无状态组件,状态由高阶组件维护
    return <input>
  }
}

const ComponentWithControlledState = withControlledState(SimpleControlledComponent);

3. パラメータの受け渡し

上位コンポーネントのパラメータは 1 つのコンポーネントだけでなく、他のパラメータも受け取ることができます。例えば、最初の例では、LocalStorage からキーデータを持つデータを取得していますが、データを取得するキーが不明な場合、上位コンポーネントの withPersistentData はニーズを満たしません。 LocalStorage からどのデータを取得するかを決定する追加パラメータを受け取ることができます:

import React, { Component } from 'react'

function withPersistentData(WrappedComponent, key) {
  return class extends Component {
    componentWillMount() {
      let data = localStorage.getItem(key);
      this.setState({ data });
    }
    render() {
      // 通过{ ...this.props} 把传递给当前组件属性继续传递给被包装的组件
      return <wrappedcomponent></wrappedcomponent>
    }
  }
}

class MyComponent extends Component {
  render() {
    return <p>{this.props.data}</p>
  }
}
// 获取 key='data' 的数据
const MyComponent1WithPersistentData = withPersistentData(MyComponent, 'data');

// 获取 key='name' 的数据
const MyComponent2WithPersistentData = withPersistentData(MyComponent, 'name');

withPersistentData の新しいバージョンは、さまざまなキー値を取得するニーズを満たしますが、実際の状況では、このメソッドを使用してデータを渡すことはほとんどありません。パラメータ ですが、より柔軟で使いやすい関数形式が採用されています。

HOC(...params)(WrappedComponent)

HOC(...params) の戻り値は上位コンポーネントです。上位コンポーネントに必要なパラメータは、まずはHOC機能。この形式の withPersistentData を次のように書き換えます (注: この形式の上位コンポーネントはアロー関数を使用してより簡潔に定義されています):

import React, { Component } from 'react'

const withPersistentData = (key) => (WrappedComponent) => {
  return class extends Component {
    componentWillMount() {
      let data = localStorage.getItem(key);
      this.setState({ data });
    }
    render() {
      // 通过{ ...this.props} 把传递给当前组件属性继续传递给被包装的组件
      return <wrappedcomponent></wrappedcomponent>
    }
  }
}

class MyComponent extends Component {
  render() {
    return <p>{this.props.data}</p>
  }
}
// 获取 key='data' 的数据
const MyComponent1WithPersistentData = withPersistentData('data')(MyComponent);

// 获取 key='name' 的数据
const MyComponent2WithPersistentData = withPersistentData('name')(MyComponent);

4. 継承による上位コンポーネントの実装

As前に紹介した 上位コンポーネントが実装される方法は、上位コンポーネントが共通ロジックを処理し、関連するプロパティをパッケージ化されたコンポーネントに渡すことです。このメソッドをプロパティ プロキシと呼びます。属性プロキシに加えて、上位コンポーネントも継承を通じて実装できます。ロジックの再利用は、パッケージ化されたコンポーネントを継承することによって実現できます。継承を通じて実装された高次コンポーネントは、レンダリングのハイジャックによく使用されます。たとえば、ユーザーがログインしているときはコンポーネントがレンダリングできるようにし、それ以外の場合は空のコンポーネントがレンダリングされるようにします。コードは次のとおりです。

function withAuth(WrappedComponent) {
  return class extends WrappedComponent {
    render() {
      if (this.props.loggedIn) {
        return super.render();
      } else {
        return null;
      }
    }
  }
}

WrappedComponent の this.props.loggedIn に基づいてユーザーがログインしているかどうかを判断します。ログインしている場合は、super.render() を介して WrappedComponent の render メソッドを呼び出してコンポーネントをレンダリングします。それ以外の場合は、継承メソッドを返します。上位コンポーネントの実装は、パッケージ化されたコンポーネントに干渉するため、サブクラス コンポーネントがスーパー経由で親クラス コンポーネントのメソッドを呼び出すことを忘れやすくなります。論理損失に陥っています。したがって、高次コンポーネントを使用する場合は、プロキシを介して実装するようにしてください。

関連提案:

超すごいJavaScript Reactフレームワーク入門チュートリアル_基礎知識

MySQL高可用性コンポーネントのMHAパラメータを詳しく解説

以上がReact の高度なコンポーネントとは何ですか? React の高度なコンポーネントの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
ブラウザを超えて:現実世界の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リクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

JavaScriptをインストールするにはどうすればよいですか?JavaScriptをインストールするにはどうすればよいですか?Apr 05, 2025 am 12:16 AM

JavaScriptは、最新のブラウザにすでに組み込まれているため、インストールを必要としません。開始するには、テキストエディターとブラウザのみが必要です。 1)ブラウザ環境では、タグを介してHTMLファイルを埋め込んで実行します。 2)node.js環境では、node.jsをダウンロードしてインストールした後、コマンドラインを介してJavaScriptファイルを実行します。

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

ホットツール

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

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

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

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境