【React.js/Next.js】React Hooks useRef 完全入門

React.js / Next.js

React Hooks の useRef ってどんな機能があるの?

今回は、React Hooks の中でも重要な useRef について、基本的な考え方や使い方、代表的なユースケースまでをわかりやすく解説します。

useRef とは?

useRef とは、React.js値を保持するためのHookの一つ で、値を変更しても再レンダリングが発生しない という特徴があります。
また useState と同様に値を保持できますが、useRef画面の再描画が不要な値をコンポーネント内で管理したい 場合に使用されます。

useRef の基本構文

特徴

  • useRef(初期値) の形で使用し、保持した値は ref.current を通して読み書きする
  • ref.current の値を変更しても 再レンダリングは発生しない
  • コンポーネントが再レンダリングされても 値は保持される
    useRef で保持している値は、画面の表示には直接反映されません。

useRef コード例

再レンダリング不要な値の保持

処理フロー

  • useRef(0) で初期値 0 を持つ ref(countRef) を作成
  • 値は countRef.current に保存され、ログに”レンダリング“が1回のみ表示される
  • ボタンをクリックするたびに値は増えるが、画面は再レンダリングされない
    countRef.current の変更では再レンダリングされない

DOMへの参照

処理フロー

  • useRef(null) を使って ref(inputRef) オブジェクトを作成する
  • 作成した ref(inputRef) を JSX の input の ref 属性に渡す
  • コンポーネントがマウントされ、DOMが生成される
  • 対応する DOM 要素が ref.current に代入される
  • ref.current を通して DOM を直接操作できる(focusscrollIntoView など)
    ※ DOMが生成される前の ref.current null のため、optional chaining(?.) が必要
注意点

React.js では、基本的に useState を使って UI を制御することが推奨されているため、DOMを直接操作する useRef は「どうしても必要な場合」に限定して使用するのが望ましいです。

useRef と useState との違い

基本的な違い

項目useStateuseRef
値の保持コンポーネントの状態として保持値を保持するが状態には含まれない
値の更新setState を使うref.current を直接変更
再レンダリング値を更新するとコンポーネントが再レンダリングされる値を変更しても再レンダリングされない
UI反映変更した値は自動で画面に反映される画面には反映されない
主な用途画面表示に関わる状態の管理再レンダリング不要の値の保持、DOM参照

使い分けるポイント

useState ※ 画面に影響する値
  • UIに表示したい値
  • ユーザー操作に応じて画面を更新したい場合
  • 値の変更に伴い、再レンダリングが必要な場合
useRef ※ 画面に影響しない値
  • 前回の値を保持して比較したいときや、初回レンダリングかどうかのフラグなど 再レンダリングが不要な値
  • DOM要素を直接操作したい場合(例: focus, scrollIntoView)
  • タイマーIDWebSocket など、外部ライブラリの参照を保持したい場合

useRef のその他ユースケース

タイマーIDの管理

  • タイマーIDtimerRef.current に保持
  • 値が変わっても再レンダリングされない
  • タイマーID を覚えておくだけなので useStateは不要

初回レンダリング判定のフラグ

  • 初回レンダリング時は isFirstRender.current === true となり、ログに”初回レンダリング” と表示される
  • 一度 false にすると、カウントのstateを+1ずつアップしても、ログに”2回目以降” と表示され、再レンダリングされずに以降も保持される
  • useRef ではなく、useState にすると無駄に 再レンダリングが発生してしまう

まとめ

React HooksuseRef について、いかがでしたでしょうか?

useRef は、前回の値を保持して比較したいとき DOM要素の直接操作初回レンダリング判定のフラグ など、画面の描画には影響しない値をコンポーネント内で管理したい場合に適したHookです。

まずは useState との違いを意識しながら、基本的な使い方をしっかり押さえ、小さなサンプルで試しながら、少しずつ useRef に慣れていきましょう。

コメント

タイトルとURLをコピーしました