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

推薦する

MySQL SHOW PROCESSLISTはトラブルシューティングの全プロセスを支援します

1. SHOW PROCESSLISTコマンドSHOW PROCESSLIST は実行中のスレッド ...

ウェブサイトメンテナンスページのリスト構築のヒント

また、多くの場合、メンテナンスのために Web サイトを少なくとも数分間オフラインにする必要がありま...

docker を使用して hbase をデプロイする方法

スタンドアロンの hbase について、まずは説明しましょう。 Dockerをインストールするまず ...

VMWare14.0.0のUbuntu仮想マシンで共有フォルダを設定する

これは私の最初のブログ投稿です。時間の制約があるため、どのようにフォーマットすればよいかわかりません...

Vite2とVue3を使用したウェブサイトの国際化を実現するプロセス全体

目次序文vue-i18nをインストールするロケールの設定getLangs.js の実装i18nインス...

WeChatミニプログラムが星評価を実装

この記事では、WeChatアプレットで星評価を実装するための具体的なコードを参考までに紹介します。具...

Kali に docker と portainer をインストールする方法

dockerの登場により、多くのサービスが徐々にハードウェアアーキテクチャへの依存から脱却しました。...

js における関数のネストとクロージャの詳細

目次1. 範囲2. 関数の戻り値3. 関数のネスト4. 終了5. クロージャの実用的応用1. 内部変...

Centos7でmysql5.7.19のデータ保存場所を移動する方法

シナリオ: データ量が増加すると、MySQL が配置されているディスクがいっぱいになり、より大きなス...

CentOS7.5 の MySQL8.0.19 のインストールチュートリアルの詳細な手順

1. はじめにこの記事には MySQL インストール部分のスクリーンショットがないので、ある程度の基...

Vue+SSMは画像アップロードのプレビュー効果を実現します

現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...

Linuxにpipパッケージをインストールする方法

1. システムの Python バージョンに応じて、pip インストール パッケージをダウンロードし...

HTML と埋め込み Flash の両方におけるスクロールバーの分析と処理

開発を行う際に、次のような状況に遭遇することがよくあります。 a.swf が Web ページに追加さ...

ネイティブ js カスタム右クリック メニュー

この記事の例では、参考のためにjsカスタム右クリックメニューの具体的なコードを共有しています。具体的...

Tomcat ディレクトリ構造の詳細な紹介

tomcat の解凍されたディレクトリを開くと、次のディレクトリ構造が表示されます。 1.Tomca...