ホームページ  >  記事  >  ウェブフロントエンド  >  React の高次コンポーネントの使用を開始する例を共有する

React の高次コンポーネントの使用を開始する例を共有する

小云云
小云云オリジナル
2018-01-13 09:19:541434ブラウズ

この記事ではReactの高階コンポーネントの紹介を中心に、高階コンポーネントとは何か、そして高階コンポーネントの使い方について詳しく紹介していきます。参考にしてください。編集者をフォローして見てみましょう。皆さんのお役に立てれば幸いです。

高次コンポーネントの定義

HoCはReactのAPIに属さず、本質的には1つ以上のReactコンポーネントをパラメータとして受け取り、新しいReactコンポーネントを返す関数です。このようなコンポーネントは、既存のコンポーネントを改造するのではなく、高次コンポーネントと呼ばれます。開発プロセス中、一部の関数を複数のコンポーネント クラスで再利用する必要がある場合、Hoc を作成できます。

基本的な使い方

ラッピングメソッド


const HoC = (WrappendComponent) => {
 const WrappingComponent = (props) => (
  <p className="container">
   <WrappendComponent {...props} />
  </p>
 );
 return WrappingComponent;
};

上記のコードでは、WrappendComponentは、HoCでpをラップして渡す通常のコンポーネントです。 className 属性、最後の WrappingComponent と受信する WrappendComponent は 2 つの完全に異なるコンポーネントです。

WrappingComponent では、WrappendComponent に渡される props を読み取り、追加、編集、削除できます。また、WrappendComponent を他の要素でラップして、カプセル化スタイルを実装したり、レイアウトを追加したり、その他の操作を行うこともできます。

組み合わせメソッド


const HoC = (WrappedComponent, LoginView) => {
 const WrappingComponent = () => {
  const {user} = this.props; 
  if (user) {
   return <WrappedComponent {...this.props} />
  } else {
   return <LoginView {...this.props} />
  }
 };
 return WrappingComponent;
};

上記のコードには、WrappedComponent と LoginView という 2 つのコンポーネントがあります。ユーザーが受信 props に存在する場合は、WrappedComponent コンポーネントが通常表示され、それ以外の場合は、LoginView コンポーネントが表示されます。ログインするユーザー。 HoC によって渡されるパラメータは複数にすることができます。たとえば、ユーザーがログインしているときにメイン ページが表示され、ユーザーがログインしていないときにログイン インターフェイスが表示されるように、複数のコンポーネントを渡します。リストをレンダリングするときは、List コンポーネントと Loading コンポーネントを渡して、新しいコンポーネントの動作を追加します。

継承メソッド


const HoC = (WrappendComponent) => {
 class WrappingComponent extends WrappendComponent {
  render() (
   const {user, ...otherProps} = this.props;
   this.props = otherProps;
   return super.render();
  }
 }
 return WrappingComponent;
};

WrappingComponentは、WrappendComponentを継承し、親の機能とプロパティを共有する新しいコンポーネントです。 super.render() または super.componentWillUpdate() を使用して親のライフサイクル関数を呼び出すことができますが、これにより 2 つのコンポーネントが結合され、コンポーネントの再利用性が低下します。

React のコンポーネントのパッケージ化は、使用可能な最小単位の考えに基づいており、コンポーネントは 1 つのことだけを実行します。これは、OOP の単一責任の原則に沿っています。コンポーネントの機能を強化する必要がある場合は、元のコードを変更するのではなく、コンポーネントを組み合わせたり、コードを追加したりして、コンポーネントを強化します。

注意事項

レンダリング関数で高次コンポーネントを使用しないでください


render() {
 // 每一次render函数调用都会创建一个新的EnhancedComponent实例
 // EnhancedComponent1 !== EnhancedComponent2
 const EnhancedComponent = enhance(MyComponent);
 // 每一次都会使子对象树完全被卸载或移除
 return <EnhancedComponent />;
}

Reactの差分アルゴリズムは、古いサブオブジェクトツリーと新しいサブオブジェクトツリーを比較して、既存のサブオブジェクトを更新するかどうかを決定しますツリーを削除するか、既存の 1 つのサブツリーを破棄して再マウントします。

静的メソッドはコピーする必要があります


// 定义静态方法
WrappedComponent.staticMethod = function() {/*...*/}
// 使用高阶组件
const EnhancedComponent = enhance(WrappedComponent);

// 增强型组件没有静态方法
typeof EnhancedComponent.staticMethod === &#39;undefined&#39; // true

Refs属性を渡すことはできません

HoCで指定されたrefは子コンポーネントには渡されず、コールバック関数を通じてpropsを使用して渡す必要があります。関連する推奨事項: ストアを使用して通信コンポーネント間の通信のインスタンス チュートリアルを最適化する


通信コンポーネント間の通信

HTML タグと React コンポーネント_Html/CSS_WEB-ITNOSE を比較する

以上がReact の高次コンポーネントの使用を開始する例を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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