ReactのRefsとuseRefフックの使い方

Reactは宣言的なアプローチを採用しています。状態(state)を更新すると、ReactがUIを更新します。これはほとんどのタスクにおいて有効です。

しかし、時にはVirtual DOMの外に出る必要がある場面もあります。実際のHTML要素に直接アクセスする必要がある場合です。そこで登場するのが、RefsとuseRefフックです。

Refとは何か?

Refはポインタです。ReactをネイティブのDOMノードに直接接続します。

なぜuseStateではなくuseRefを使うのか?

Stateの更新は再レンダリングをトリガーします。つまり、Reactが画面上のコンポーネントを書き換えることを意味します。 Refの更新は再レンダリングをトリガーしません。そのため、値は変化するものの、すぐにUIに反映させる必要がない場合に最適です。

よくあるユースケース:

• 入力フィールドへの自動フォーカス。 • ビデオやオーディオ要素の制御(再生/一時停止)。 • 要素の幅や高さの測定。 • setIntervalsetTimeoutのタイマーIDの保存。

useRefの使い方:

  1. ReactからuseRefをインポートする。
  2. 初期化する: const myRef = useRef(null)
  3. 要素にアタッチする: <input ref={myRef} />
  4. 値にアクセスする: myRef.current

例1:入力フィールドへの自動フォーカス

ユーザーがページにアクセスした際、カーソルをテキストボックス内に置きたい場合があります。この場合、コンポーネントがマウントされた後にuseEffectを使用してmyRef.current.focus()を呼び出します。

例2:ストップウォッチ

setIntervalのIDをstateに保存すると、タイマーが刻むたびにコンポーネントが再レンダリングされます。これはパフォーマンスを低下させます。IDをrefに保存すれば、コンポーネントの動作は高速なままです。値は再レンダリングの間も保持され、ブラウザに追加の負荷をかけることなく安全に管理できます。

State vs Ref:

• State: 再レンダリングをトリガーする。UIデータに使用。更新は非同期。 • Ref: 再レンダリングを行わない。DOMへのアクセスやメモリ保持に使用。更新は同期。

シニアエンジニア向けのプロのヒント:

• 過剰な使用を避ける。宣言的なロジックで対応できない場合にのみrefを使用してください。 • メモリのクリーンアップ。クリーンアップ関数内で、必ずsetIntervalやイベントリスナーを解除してください。 • レンダリング中にrefへ書き込まない。ref.currentの更新は、useEffect内またはイベントハンドラー内でのみ行ってください。これにより副作用を防げます。 • forwardRefを使用する。カスタムの子コンポーネントにrefを渡したい場合は、その子コンポーネントをReact.forwardRefでラップする必要があります。

出典: https://dev.to/banti_kevat_8e2d123bb7994/react-me-refs-aur-useref-hook-kaise-use-karein-2dde