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 のマスタースレーブレプリケーションと読み取り書き込み分離の原理と使用法の詳細な説明

この記事では、例を使用して、MySQL マスター/スレーブ レプリケーションと読み取り/書き込み分離...

Windows ベースの MySQL 8.0.12 のインストール

このチュートリアルは Windows システムにのみ適用されます。インストールしたがまだインストール...

aタグのname属性とid属性を使用してページ内を移動する方法

以前はaタグのname属性を使ってジャンプする方法しか知らなかったのですが、idも使えることを今日知...

MySql 認証に基づく vsftpd 仮想ユーザー

目次1. MySQLのインストール1.2 テーブル、データベース、ユーザーを作成する1.3 リモート...

MySQLのkillがスレッドをkillできない理由

目次背景問題の説明原因分析シミュレーションする総括する背景日常の使用において、MySQL で個別また...

MYSQL ローカルインストールと問題解決

序文この記事はかなり詳細で、少し面倒です。他のチュートリアル ドキュメントでは多くの手順が省略されて...

適応分析と応答分析の違いを専門用語で詳しく説明

日々の開発経験と関連するオンライン情報に基づいて、アダプティブとレスポンシブの違いをシンプルでわかり...

vue $setは配列コレクションオブジェクトへの値の割り当てを実装します

Vue $set 配列コレクションオブジェクトの割り当てVue カスタム配列オブジェクト コレクショ...

Reactコンポーネントのライフサイクル機能についての簡単な説明

React コンポーネントのライフサイクル機能とは何ですか?ライフサイクル関数は、ES6 構文クラス...

まだ*を選択しますか?

アプリケーションが牛のように遅い理由は数多くあります。ネットワーク、システム アーキテクチャ、または...

JavaScript におけるシリアル操作と並列操作

目次1. はじめに2. es5メソッド3. 非同期関数のシリアル実行4. 非同期関数の並列実行5. ...

FileZilla 425 FTP に接続できない (Alibaba クラウド サーバー) の解決策

Alibaba Cloud ServerがFTPに接続できないFileZilla 425 データ接続...

JS の compose 関数と pipe 関数の使い方の詳細な説明

目次作成機能配列プロトタイプの削減Array.prototype.reduceRightパイプ関数作...