React における ref の一般的な使用法の概要

React における ref の一般的な使用法の概要

Refsとは何か

Ref は、レンダリング メソッドで作成された DOM ノードまたは React 要素にアクセスできるようにする方法を提供します。
Ref 転送は、ref をコンポーネントを通じてその子に自動的に渡す手法です。 DOM ノードまたは React 要素インスタンスを取得するためによく使用されるツール。 React の Ref は、レンダリング メソッドで作成された DOM ノードまたは React 要素にユーザーがアクセスできるようにする方法を提供します。

参照

Ref 転送は、特定のコンポーネントが ref を受信して​​それを子コンポーネントに渡す (つまり、「転送する」) ことを可能にするオプションの機能です。

デフォルトでは、関数コンポーネントにはインスタンスがないため、ref 属性は使用できません。

1. 文字列参照

文字列参照にいくつかの問題があるため、このメソッドを使用することはお勧めしません。これは非推奨であり、将来のバージョンで削除される可能性があります。

「react」からReactをインポートします。
// 親コンポーネントのエクスポート デフォルトクラス StringRef は React.PureComponent を拡張します {
  コンポーネントマウント() {
    console.log("stringRefDom:", this.refs.stringRefDom);
    console.log("stringRefComp:", this.refs.stringRefComp);
  }
  与える() {
    戻る (
      <div>
        ネイティブ コンポーネントの使用方法*/
        <div ref={"stringRefDom"}>文字列参照Dom</div>
        クラスコンポーネントの使用方法*/
        <StringRefComp ref={"stringRefComp"} />
      </div>
    );
  }
}
//クラスコンポーネントクラスStringRefCompはReact.PureComponentを拡張します{
  与える() {
    <div>StringRefComp</div> を返します。
  }
}

2. コールバック参照

  • ref コールバック関数がインライン関数として定義されている場合、更新プロセス中に 2 回実行されます。
  • 1回目はパラメータがnullで、2回目はパラメータDOM要素が渡されます
  • これは、レンダリングごとに関数の新しいインスタンスが作成され、React が古い参照をクリアして新しい参照を設定するためです。
  • 上記の問題は、ref のコールバック関数をクラスのバインドされた関数として定義することで回避できます。
  • しかしほとんどの場合それは無関係です
「react」からReactをインポートします。
// 親コンポーネントのエクスポート デフォルトクラス CallbackRef は React.PureComponent を拡張します {
  コンストラクタ(props) {
    スーパー(小道具);
    this.callbackRefDom = null;
    this.callbackRefComp = null;
  }
  コンポーネントマウント() {
    console.log("コールバックRefDom:", this.callbackRefDom);
    console.log("コールバックRefComp:", this.callbackRefComp);
  }
  //コールバック関数 setCallbackRefDom = (ref) => {
    this.callbackRefDom = ref;
  };
  setCallbackRefComp = (ref) => {
    this.callbackRefComp = ref;
  };
  //コールバック関数render() {
    戻る (
      <div>
        <div ref={this.setCallbackRefDom}>コールバックRefDom</div>
        <CallbackRefComp ref={this.setCallbackRefComp} />
      </div>
    );
  }
}

//クラスコンポーネントクラスCallbackRefCompはReact.PureComponentを拡張します{
  与える() {
    <div>callbackRefComp</div> を返します。
  }
}

React.createRef()

  • React 16.3が導入されました
  • React の以前のバージョンでは、コールバック ref が推奨されています。
「react」からReactをインポートします。
// 親コンポーネントのエクスポート デフォルトクラス CreateRef は React.PureComponent を拡張します {
  コンストラクタ(props) {
    スーパー(小道具);
    React のインスタンスを作成します。
    this.createRefComp = React.createRef();
  }
  コンポーネントマウント() {
    console.log("createRefDom:", this.createRefDom.current);
    console.log("createRefComp:", this.createRefComp.current);
  }
  与える() {
    戻る (
      <div>
        <div ref={this.createRefDom}>RefDom を作成します</div>
        <CreateRefComp ref={this.createRefComp} />
      </div>
    );
  }
}
//クラスコンポーネントクラスCreateRefCompはReact.PureComponentを拡張します{
  与える() {
    <div>CreateRefComp</div> を返します。
  }
}

4. 参照

  • フックはReact 16.8の新機能です
React をインポートし、{useEffect} を "react" から取得します。
// 親コンポーネント const UseRef = React.memo(() => {
  // // 以下も使用できます // const createRefDom = React.createRef();
  // const createRefComp = React.createRef();
  React のインスタンスを 1 つ作成します。
  React のインスタンスを作成します。
  使用効果(() => {
    console.log("useRefDom:", createRefDom.current);
    console.log("useRefComp:", createRefComp.current);
  }, []);
  戻る (
    <div>
      <div ref={createRefDom}>useRefDom</div>
      <UseRefComp ref={createRefComp} />
    </div>
  );
});

デフォルトのUseRefをエクスポートします。

//クラスコンポーネントクラスUseRefCompはReact.PureComponentを拡張します{
  与える() {
    <div>useRefComp</div> を返します。
  }
}

5. 参照と関数コンポーネント

  • デフォルトでは、関数コンポーネントにはインスタンスがないため、ref 属性は使用できません。
  • 関数コンポーネントでrefを使用する場合は、forwardRefを使用できます(useImperativeHandleと組み合わせて使用​​できます)。
  • または、コンポーネントをクラス コンポーネントに変換します。
「react」から React をインポートし、{useEffect、useImperativeHandle} を追加します。

// 親コンポーネント const ForwardRef = React.memo(() => {
  React のインスタンスを作成します。
  React の RefCompMethod を const として定義します。

  使用効果(() => {
    console.log("useRefComp:", createRefComp.current);
    console.log("createRefCompMethod:", createRefCompMethod.current);
    createRefComp.current.reload();
  }, []);
  戻る (
    <div>
      <ForwardRefFunc ref={createRefComp} />
    </div>
  );
});

デフォルトの ForwardRef をエクスポートします。

const RefFunc = React.forwardRef((props, ref) => {
  const [name, setName] = React.useState(null);
  定数リロード = () => {
    console.log("リロード");
    タイムアウトを設定する(() => {
      名前を設定します("ForwardRefFunc");
    }, 3000);
  };
  //useImperativeHandle を使用すると、refuseImperativeHandle(ref, () => { を使用するときに親コンポーネントに公開されるインスタンス値をカスタマイズできます。
    戻る {
      リロード: リロード、
    };
  });
  <div ref={ref}>ForwardRefFunc {name}</div> を返します。
});
React の RefFunc を実装します。

forwardRef と useImperativeHandle の最終的な目標は、呼び出し可能なオブジェクトを参照に提供することです。

  • Ref と DOM
  • フォワード参照
  • 命令型ハンドルを使用する

要約する

これで、React での ref の一般的な使用法に関するこの記事は終了です。React での ref の使用法の詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • React の 3 つの主要属性における Ref の使用に関する詳細な説明
  • React refsの詳細な紹介
  • React で refs を使用するチュートリアル
  • Reactコンポーネントrefsの使用に関する詳細な説明
  • React の Refs 属性をご存知ですか?

<<:  仮想マシンのディスクサイズを拡張する方法

>>:  MySQL 8.0 DDLアトミック機能と実装原則

推薦する

Linux 脆弱性スキャンツール lynis の使用分析

はじめに: Lynis は、徹底的なセキュリティ スキャンを実行できる Unix システム用のセキュ...

jsvc を使用して tomcat を起動する方法 (通常のユーザーとして実行)

jsvc の紹介実稼働環境では、Tomcat はデーモン モードで実行する必要があります。Tomc...

MySQLのトランザクションとデータ一貫性処理の問題を分析する

この記事では、セキュリティ、使用方法、同時処理などを通じて、MySQL トランザクションとデータの一...

メンテナンスしやすい CSS コードを書くための 5 つのガイドライン

1. スタイルシートの先頭にコメント ブロックを追加して、スタイルシートの作成日、作成者、タグ、その...

mysql: [エラー] 不明なオプション '--skip-grant-tables'

MySQL データベースがエラー 1045 (28000): ユーザー 'ODBC'...

HTML テーブル境界制御実装コード

一般的に、テーブルを使用する場合は、常に <table border="1"...

wgetはウェブサイト全体(サブディレクトリ全体)または特定のディレクトリをダウンロードします

wgetコマンドを使用して、親ディレクトリの下のサブディレクトリ全体をダウンロードします。親ディレク...

MySQL 8.0 の新機能の分析 - トランザクション データ ディクショナリとアトミック DDL

序文トランザクション データ ディクショナリとアトミック DDL は、MySQL 8.0 で導入され...

Tomcat でのサーブレットの作成と実装に関する深い理解

1. サーブレットとは何か1.1. 正式な言葉で説明する:サーブレットは、動的な Web リソースを...

JavaScript が Jingdong のカルーセル効果を模倣

この記事では、JD.comのカルーセル効果の表示を実現するためのJavaScriptの具体的なコード...

Vueはプライベートフィルターと基本的な使用法を定義します

プライベート フィルターとグローバル フィルターのメソッドと概念は同じですが、プライベート フィルタ...

CSS フロントエンドページレンダリング最適化属性 will-change の具体的な使用法

序文スクロールやサイズ変更などのスクロール イベントがトリガーされると、トリガーの頻度が非常に高くな...

CSS3は子供のころの紙飛行機を実現する

今日は折り紙飛行機(飛べる飛行機)を作ります基本的にすべてCSSで実装されており、JSはごく一部に過...

簡単な約束を段階的に実行する方法を教えます

目次ステップ1: フレームワークを構築するステップ2 構築されたPromiseフレームワークに入力す...

Windows の MySQL net start mysql MySQL サービスの起動エラーが発生する システムエラーの解決

目次1- エラーの詳細2-シングルソリューション2.1-ディレクトリ C:\Windows\Syst...