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 のインストールチュートリアル(推奨)

推薦する

ServerSocketのデフォルトIPバインディングの実装プロセスの詳細な説明

開発中にサーバーを起動する必要がある場合、ローカルテストではポートを直接書き込み、実際の環境ではバイ...

MySQL 外部キー制約の一般的な操作の例 [表示、追加、変更、削除]

この記事では、例を使用して、MySQL 外部キー制約の一般的な操作について説明します。ご参考までに、...

フロントエンド JavaScript でローカルあいまい検索機能を実装する方法の例

目次1. プロジェクトの見通し2. 知識ポイントObject.assign() の使用法filter...

js 学習ノート: class、super、extends キーワード

目次序文1. es6の前にオブジェクトを作成する2. es6 後のクラス宣言3. クラスの継承4. ...

MySQL 8.0.26 のインストールと簡易チュートリアル (インターネット上で最も完全)

目次1. MySQLをダウンロードする1.1 ダウンロード1.2 インストール1. MySQLをダウ...

Linux の一般的な Java プログラム起動スクリプトのコード例

シェルを起動する頻度は非常に低いですが。 。 。しかし、書くたびに、多くの jar ファイル パスを...

React Nativeでシンプルなゲームエンジンを作る

目次導入始めるReact Nativeゲームエンジンの簡単な紹介React Nativeでスネークゲ...

インデックスを使用して数千万のデータを持つ MySQL のクエリ速度を最適化する

1. インデックスの役割一般的に言えば、インデックスは本の目次に相当します。条件に基づいてクエリを実...

Dockerコンテナのディスクがいっぱいになった場合の状況のまとめ

序文この記事では、最近私が遭遇した 2 つの状況について説明します。今後、新たな発見があれば追加して...

CSS 3D からソースコードによる空間座標軸へ

かつて、サイコロを振るゲームについて話しました。その時は、steps 属性 + スプライト画像を使用...

Linuxの基本コマンドmktempの詳しい説明

mptemp は安全な方法で一時ファイルまたはディレクトリを作成します。このコマンドの適用範囲: R...

MySQL で日付を保存するためのベスト プラクティス ガイド

目次序文時間型を保存するのに文字列を使用しないでくださいMySQL の日付型日時タイムスタンプTIM...

Vue は PDF.js を統合して PDF プレビューを実装し、透かしを追加する手順を実行します。

目次成果を達成する利用可能なプラグインの紹介ニーズに応じてプラグインを選択するプラグインのインストー...

Linux で固定 IP を設定する方法 (テスト済みで効果的)

まず、仮想マシンを開きます xshell5 を開いて仮想マシンに接続します (より便利です。Linu...