ReactにおけるuseRefの具体的な使い方

ReactにおけるuseRefの具体的な使い方

React の経験がある人なら、コンポーネントインスタンスオブジェクトや DOM オブジェクトを取得するために使用できる ref をよくご存知だと思います。

従来の使用法に加えて、useRef フック関数は「レンダリング サイクル全体にわたって」データを保存することもできます。

まず、その伝統的な使用法を見てみましょう。

'react' から React、{ useState、useEffect、useMemo、useRef } をインポートします。

デフォルト関数App(props)をエクスポートする{
  定数[count, setCount] = useState(0);

  定数doubleCount = useMemo(() => {
    2 * カウントを返します。
  }, [カウント]);

  const カウンタRef = useRef();

  使用効果(() => {
    document.title = `値は ${count} です`;
    console.log(カウンタ参照.current);
  }, [カウント]);
  
  戻る (
    <>
      <button ref={couterRef} onClick={() => {setCount(count + 1)}}>カウント: {count}、double: {doubleCount}</button>
    </>
  );
}

このコードは、useRef を使用して counterRef オブジェクトを作成し、それをボタンの ref 属性に割り当てます。このように、couterRef.current にアクセスすることで、ボタンに対応する DOM オブジェクトにアクセスできます。

それでは、データを保存する方法を見てみましょう。

コンポーネント内に、レンダリング サイクルを超えて存続できるもの、つまりコンポーネントが複数回レンダリングされた後も一定のままであるプロパティはありますか?最初に思い浮かぶのは状態です。そうです、コンポーネントの状態は複数回のレンダリング後も変更されない場合があります。ただし、状態の問題は、状態が変更されると、コンポーネントが再レンダリングされることです。

現時点では、useRef はレンダリング サイクル全体にわたってデータを保存するために使用でき、これを変更してもコンポーネントのレンダリングは発生しません。

'react' から React、{ useState、useEffect、useMemo、useRef } をインポートします。

デフォルト関数App(props)をエクスポートする{
  定数[count, setCount] = useState(0);

  定数doubleCount = useMemo(() => {
    2 * カウントを返します。
  }, [カウント]);

  タイマーIDをuseRef()で設定します。
  
  使用効果(() => {
    タイマーID.current = setInterval(()=>{
        setCount(count => count + 1);
    }, 1000); 
  }, []);
  
  使用効果(()=>{
      if(カウント > 10){
          タイマーID.currentをクリアします。
      }
  });
  
  戻る (
    <>
      <button ref={couterRef} onClick={() => {setCount(count + 1)}}>カウント: {count}、double: {doubleCount}</button>
    </>
  );
}

上記の例では、ref オブジェクトの current プロパティを使用してタイマー ID を保存し、複数回のレンダリング後にタイマー ID を保存して、タイマーを正常にクリアできるようにしています。

React における useRef の具体的な使い方についてはこれで終わりです。React の useRef に関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • ReactでuseStateを使用する詳細な例
  • JavaScript の useRef と useState の紹介

<<:  Centos7.x での Nginx のインストール、SSL 設定、一般的なコマンドの詳細な説明

>>:  Mysqlトランザクション処理の詳細な説明

推薦する

ウィンドウとLinuxプロジェクトを展開する際のLinuxファイルパスに問題はありません

長い間ブログを書いていませんでした。先週、プロジェクトをテストしたところ、いくつかのバグが見つかりま...

ログインインターフェースの使いやすさとセキュリティのバランスをとる方法

ウェブデザイナーでもUIデザイナーでも、ログインページや登録ページのデザインは必ず経験しなければなら...

Lua モジュールを使用して WAF を実装する Nginx の原理の分析

目次1. WAFの背景2. WAFとは3. 動作原理4. WAF機能5. WAFと従来のファイアウォ...

CSS コード省略 div+css レイアウト コード省略仕様

略語を使用すると、CSS ファイルのサイズが小さくなり、読みやすくなります。 CSS 省略形の主なル...

MySQLとElasticsearch間のデータ非対称性問題の解決策

MySQLとElasticsearch間のデータ非対称性問題の解決策jdbc-input-plugi...

MySQL 8.0.21 の最新バージョンのダウンロード、インストール、設定に関する詳細なチュートリアル

1. ダウンロード1. インストールパッケージをダウンロードするMySQL ダウンロード パス: h...

VMware Workstation Pro 16 グラフィックチュートリアル (CentOS8 仮想マシン クラスタの構築)

目次準備VMware Workstation Pro 16 をインストールするLinux仮想マシンの...

CSS3はウェブサイトの製品表示効果図を実現します

この記事では、CSS3 を使用した Web サイトの商品表示の効果を紹介し、皆さんと共有します。詳細...

特定のシンボルで複数の行と列に分割するMySQLの例

一部の障害コード テーブルでは、履歴またはパフォーマンス上の理由から、次の設計パターンが使用されます...

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

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

システムエラー 1067 を解決するための MySQL データベース グリーン バージョンのインストール チュートリアル

ソフトウェアのグリーンバージョンとインストールバージョンの違いは何ですか?通常、ファイルのインストー...

Google Chromeの自動入力問題に対する完璧な解決策

Google Chrome では、ログインに成功すると、パスワードを記憶するかどうかを尋ねるメッセー...

MySQLデータベース最適化技術の簡単な紹介

成熟したデータベース アーキテクチャは、最初から高可用性、高スケーラビリティなどの機能を備えて設計さ...

Quill エディタでカスタム HTML レコードを挿入する詳細な例

もう2020年です。飢えた人間は単純なテキストでは満足できなくなり、さまざまなスタイルの派手なテキス...

Dockerfileを使用してApacheイメージを作成する方法

目次1. Dockerイメージ2. 既存のイメージに基づいてインスタンスを作成する3. ローカルテン...