React forwardRefの使い方と注意点

React forwardRefの使い方と注意点

これまで react.forwardRef は react の高階コンポーネントには適用できませんでした。最近やっとわかったので、書き留めておきます。重要な点は、React.forwardRef API の ref が React コンポーネントではなく dom 要素を指す必要があることです。

React.forwardRef の使用例

以下は、React コンポーネントに適用されたこのエラーの例です。

const A = React.forwardRef((props,ref)=><B {...props} ref={ref}/>)

これは私が以前よくやっていた間違いです。ここでの参照は効果的ではありません。

前述したように、ref は DOM 要素を指す必要があるため、正しいメソッドが適用されます。

const A = React.forwardRef((props, ref) => (
<div ref={ref}>
<B {...小道具} />
</div>
))

機能と注意点

  1. 親コンポーネントはrefオブジェクトを作成し、それを子コンポーネントのDom要素またはクラスコンポーネントにバインドします。
  2. 関数コンポーネントにはインスタンスがない
  3. 高レベルのコンポーネントには特別な処理が必要

親コンポーネントは子コンポーネントのDom要素インスタンスを取得します。

ここに画像の説明を挿入

React をインポートし、{useRef} を 'react' から取得します。
'./content' からコンテンツをインポートします。

const ホーム = () => {
  // Ref オブジェクトを作成します。const connectRef = useRef(null);

  const handleFoucus = () => {
    _ref を connectRef.current に設定します。
    _ref.focus();
  };

  戻る (
    <div>
        <ボタンのクリック={() => handleFoucus()}>
          子コンポーネントでDOM要素のメソッドを使用する</button>

        <コンテンツref={connectRef} />
    </div>
  );
};

デフォルトのホームをエクスポートします。
React をインポートし、{ forwardRef } を 'react' から取得します。

/**
 * forwardRefがラップした後、refは渡されたref属性を受け取るための2番目のパラメータとして使用されます。 * 例
 * <コンテンツ数={count} ユーザー={user} 参照={connectRef}>
 *
 * @param props - {count, user}
 * @param ref - connectRef
 * */
const コンテンツ = (props, ref) => {
  戻る (
    <div>
   	  {/* 渡された ref に ref をバインドする ≈ ref={connectRef} */
      <input type="password" ref={ref} />
    </div>
  )
};

デフォルトの forwardRef(Content) をエクスポートします。

親コンポーネントは子コンポーネントのクラスコンポーネントインスタンスを取得します。

ここに画像の説明を挿入

React をインポートし、{useRef} を 'react' から取得します。
'./content' からコンテンツをインポートします。

const ホーム = () => {
  // Ref オブジェクトを作成します。const connectRef = useRef(null);

  定数handleAdd = () => {
    _ref を connectRef.current に設定します。

    const { count } = _ref.state;
    _ref.setState({
      カウント: カウント + 1
    })
  };

  戻る (
    <div>
        <ボタンのクリック={() => handleAdd()}>
          子コンポーネントでクラスコンポーネントのプロパティとメソッドを使用する</button>

        <コンテンツref={connectRef} />
    </div>
  );
};

デフォルトのホームをエクスポートします。
React をインポートし、{ forwardRef } を 'react' から取得します。
'./header' からヘッダーをインポートします。
'./footer' からフッターをインポートします。

/**
 * forwardRefがラップした後、refは渡されたref属性を受け取るための2番目のパラメータとして使用されます。 * 例
 * <コンテンツ数={count} ユーザー={user} 参照={connectRef}>
 *
 * @param props - {count, user}
 * @param ref - connectRef
 * */
const コンテンツ = (props, ref) => {
  戻る (
    <div>
      {/* 渡された ref に ref をバインドする ≈ ref={connectRef} */
      <Header ref={ref} />{/* クラス コンポーネント*/
		
      {/* <Footer ref={ref} /> 関数コンポーネントにはインスタンスがないので、connectRef.current: null */
    </div>
  )
};

デフォルトの forwardRef(Content) をエクスポートします。
'react' から React をインポートします。

デフォルトクラス Header をエクスポートし、React.Component を拡張します {
  状態 = {
    カウント: 0
  };

  与える() {
    戻る (
      <div>
        {この州数}
      </div>
    )
  }
};

高階成分の特殊なケース

高階コンポーネントは受信したすべてのプロパティをラップされたコンポーネントに渡します(透過的な伝送)
Ref は key に似ています。prop ではないので、渡されません。Ref は外側のパッケージ コンテナーにバインドされます。

/*
  参照の処理
  例: Hoc1(Hoc2(コンテンツ))

  <Content ref={myRef} /> Content にバインドされた ref は Hoc1 にバインドされ、最初のメソッド React.forwardRef には渡されません ================

      React.forwardRef()を使用してHoc1の外部でrefを処理し、propsを使用してrefを渡す
      0. forwardRefを高階成分の外側にラップし、refをインターセプトして取得し、props(xxx={ref})を追加し、実際の成分はprops.xxxを通じて取得されます1. 使用時にref={XXXX}を渡す // 2番目の方法との違い2. forwardRefの2番目のパラメータを使用してrefを取得します
      3. 参照を下方に転送するための新しいプロパティを追加します。例: forwardedRef={ref}
      4. 実際のコンポーネントにref={props.forwardedRef}をバインドする

      const Home = (props) => {
        定数 connectRef = useRef(null);

        戻る (
          <div>
            <コンテンツref={connectRef} />
          </div>
        );
      };

      // ラップされたコンポーネント const Content = (props) => {
        戻る (
          <div>
            <input type="password" ref={props.forwardedRef} />
          </div>
        );
      };


      // forwardRef の 2 番目の入力パラメータは ref を受け取り、Hoc の外側のレイヤーで ref を処理できます export default React.forwardRef((props, ref) => {
        const Wrapper = React.memo(Content); // Hoc

        // forwardRef は Wrapper をラップします
        // Wrapper 内の実際のコンポーネントに ref を渡す必要があります // Wrapper に props 属性を追加し、ref オブジェクトを props として子コンポーネントに渡します return <Wrapper {...props} forwardedRef={ref} />;
      });

  2番目の方法 ==========

  0. 使用時に参照を保存するにはpropsを使用します
  1. 使用時にxxx={ref}を渡す // 最初の方法との違い 2. 実際のコンポーネントでref={props.xxx}をバインドする

  const Home = (props) => {
    定数 connectRef = useRef(null);

    戻る (
      <div>
        <コンテンツ forwardedRef={connectRef} />
      </div>
    );
  };

  // 高階コンポーネントを定義する export const Hoc = (WrappedComponent) => {
    クラス Wrapper は React.Component を拡張します {
      与える() {
        <WrappedComponent {...props} /> を返します。
      }
    }
  }

  // ラップされたコンポーネント const Content = (props) => {
    戻る (
      <div>
        <input type="password" ref={props.forwardedRef} />
      </div>
    );
  };

  // パッケージ化プロセス export default Hoc(Content);

* */

以上がReact forwardRefの使い方と注意点の詳しい内容です。React forwardRefの使い方についてさらに詳しく知りたい方は、123WORDPRESS.COM内の他の関連記事もぜひご注目ください!

以下もご興味があるかもしれません:
  • Vue3 の組み合わせ API における setup、ref、reactive の完全な使用方法
  • Reactのref属性を深く理解する方法
  • React の 3 つの主要属性における Ref の使用に関する詳細な説明
  • ReactにおけるuseRefの具体的な使い方
  • React refの使用例
  • ReactでRefを使用する方法の詳細な説明
  • react-refetchの使い方の詳しい説明
  • Reactのrefのデモ例を2つ学ぶ
  • React で refs を使用するチュートリアル
  • Reactコンポーネントrefsの使用に関する詳細な説明
  • React Native での RefreshContorl プルダウン リフレッシュの使用
  • ReactにおけるRefの相互利用の詳細な説明

<<:  Linux で cmake を使用して MySQL をコンパイルおよびインストールするための詳細なチュートリアル

>>:  CentOS8 jdk8 / java8 のインストールチュートリアル(推奨)

推薦する

Linux パーティションまたは論理ボリュームにファイルシステムを作成する方法

序文システムにファイル システムを作成し、それを永続的または非永続的にマウントする方法を学習します。...

Ubuntu 18でターミナルを美しいコマンドラインプロンプトに変更する方法

VMware と Ubuntu を再インストールしましたが、コマンドラインプロンプトが単調すぎて美し...

要素の読み込み効果を実現するための純粋なHTML+CSS

これは Element UI の読み込みコンポーネントのエフェクトです。かっこいいですね。実装してみ...

フォーム内の無効なフォームフィールドの値を送信する方法 サンプルコード

フォーム内のフォーム フィールドが無効に設定されている場合、フォーム フィールドの値は送信されません...

Windows での MySQL 8.0.18 インストール チュートリアル (図解)

ダウンロードダウンロードアドレス: https://dev.mysql.com/downloads/...

スネークゲームを作るための Pygame コード

目次使用されるPygame関数スクリーンの作成ヘビの作成ヘビを動かすゲームオーバーの処理食事を増やす...

vue-video-player でのブレークポイント再開の実装

最近のプロジェクトでは、ブレークポイントからビデオの再生を再開する機能を実装する必要がありました。こ...

デザイン理論:テキスト表現とユーザビリティ

<br />テキストデザインでは、通常、テキストのレイアウト、つまりテキストをより美しく...

CenOS6.7 mysql 8.0.22 のインストールと設定方法のグラフィックチュートリアル

CenOS6.7 は MySQL8.0.22 (推奨コレクション) をインストールします1. MyS...

Docker イメージのデフォルトの保存場所を変更する方法 (ソリューション)

システムの初期のパーティション分割により、オペレーティング システム内の対応する / パーティション...

Dockerfile を使用して nginx イメージを構築する例

Dockerfile の紹介Docker は、Dockerfile の内容を読み取ってイメージを自動...

Dockerデータストレージのバインドマウントの詳細な説明

この記事を読む前に、Volumes について予備知識を身に付けておいてください。詳細については、こち...

MySQLスローログクエリの詳細な説明

遅いログクエリ機能スロー ログ クエリの主な機能は、設定された時間しきい値を超える SQL ステート...

CentOS 7にDockerをインストールする

Linuxシステムをお持ちでない場合は、ダウンロードとインストールについてはhttps://www....

MySQLのREDOログとUNDOログの詳細な説明

MySQL ログ システムで最も重要なログは、REDO ログとアーカイブ ログです。後者は MySQ...