前回:Reactのレンダリング最適化:useMemoとuseCallbackで無駄な再描画を防ぐでは、アプリを爆速にする「賢いサボり方」を学びました。
Reactの基本ルールは「データ(State)を変えて、画面を自動で更新させる」ことでしたね。しかし、開発をしていると、どうしてもこのルールだけでは解決できない**「泥臭い操作」**が必要になる瞬間があります。
- 画面が開いた瞬間に、入力欄にフォーカスを合わせたい
- 動画プレイヤーを再生・停止させたい
- スクロール位置を特定の位置まで飛ばしたい
これらはReactの「自動更新」にお任せするのではなく、ブラウザの部品(DOM)を直接指で触るような操作です。そんな時に使う魔法の杖が useRef(ユー・レフ) です。
1. useRefは「狙い撃ち」するための道具
useRef には、大きく分けて2つの役割があります。
- DOMへのアクセス: 特定のHTMLタグを「これ!」と指し示す。
- 値をこっそり保持: 画面を書き換え(再描画)させずに、データを裏で取っておく。
第6回のuseStateとの最大の違いは、**「中身を書き換えても画面が更新されない」**という点です。画面には出さないけれど、プログラムの裏側で覚えておきたい情報を扱うのに最適です。
2. 書き方の基本:refをタグに貼り付ける
使い方は3ステップです。
- 作成:
const myRef = useRef(null);で入れ物を作る。 - 紐付け: JSXのタグに
ref={myRef}と書く。 - 操作:
myRef.currentを通じて中身を触る。
必ず .current というプロパティを経由するのが、useRef独自のルールです。
3. 【実践】ボタンを押して入力欄にフォーカス!
今回は、ボタンをクリックした瞬間に、離れた場所にある入力欄にカーソルを自動で移動させる(フォーカスする)サンプルを作ります。 第2回の環境で作成した App.jsx を書き換えてみましょう。
App.jsx(最小構成版)
JavaScript
import React, { useRef } from 'react';
export default function App() {
// 1. input要素を指し示すための「入れ物」を作る
const inputRef = useRef(null);
const handleFocus = () => {
// 3. inputRef.current で実際のHTML要素にアクセスし、
// JavaScript標準の focus() メソッドを実行する
inputRef.current.focus();
};
return (
<div style={{ textAlign: 'center', marginTop: '50px' }}>
<h1>useRef の実践</h1>
{/* 2. ref属性を使って、このinputタグをinputRefに紐付ける */}
<input
ref={inputRef}
type="text"
placeholder="ここがターゲットです"
/>
<div style={{ marginTop: '20px' }}>
<button onClick={handleFocus}>
入力欄にジャンプ!
</button>
</div>
<p>※ReactのStateを使わず、直接HTML要素を操作しています。</p>
</div>
);
}
CodeSandboxでuseRefのフォーカス操作を体験する
4. コードの解説(JavaScript & React)
JavaScriptのポイント
HTMLElement.focus(): ブラウザが標準で持っている命令で、指定した入力要素を選択状態にします。nullからの開始: 画面が表示される前は要素が存在しないため、useRefの初期値は通常nullにします。
Reactのポイント
.currentプロパティ:inputRef自体はただのオブジェクトで、その中のcurrentという引き出しの中に、本物のHTML要素(DOM)が格納されます。- 再描画されないメリット: もしこれを
useStateで管理しようとすると、フォーカスするたびに画面全体を書き換えることになり、パフォーマンスが落ちてしまいます。useRefなら画面に影響を与えず「操作」だけを行えます。
5. 2026年の学び:使いすぎは「Reactらしさ」を壊す?
2026年現在のReact開発において、useRef は非常に便利ですが、**「最後の手段」**として使うのが鉄則です。
- 良い使い方: フォーカス、スクロール、Canvasの操作、サードパーティ製ライブラリ(図形描画など)との連携。
- 悪い使い方: 入力した文字を
useRefで取得して画面に出そうとする(これは 第10回の制御コンポーネント の仕事です)。
Reactの「自動で画面が変わる」という良さを活かしつつ、ここぞという時に useRef を繰り出すのが、プロのエンジニアへの道です。
今回のまとめ
- useRef は、特定のHTML要素(DOM)を直接触るための道具。
- 使うときは、必ず
.currentを経由する。 - 中身を書き換えても 画面は再描画されない。
- フォーカス制御やアニメーションなど、**「操作」**が必要な時に使う。
次回予告:コードをスッキリ「自作フック」
これまで useState や useEffect など、たくさんの「フック」を学んできました。でも、同じような処理(例えば「APIからデータを取る処理」)を、あちこちのファイルで書くのは面倒ですよね。
次回、「第14回:カスタムフック(Custom Hooks)自作入門:ロジックを共通化してコードをスッキリさせる」。 あなた専用の「オリジナルフック」を作って、コードを劇的に美しくする方法を伝授します。お楽しみに!
本日の宿題: サンプルコードに「文字を全消しするボタン」を追加してみてください。inputRef.current.value = "" と書くとどうなりますか?(※本来はStateでやるべきことですが、useRefの「直接操作」を実感する練習として試してみましょう!)


コメント