React の useRef はいつ使いますか。useState との違いは何ですか

useRef は描き直しをまたいで値を覚えておく箱で、変えても描き直さない、と答える問い。DOM の要素に触る使い方、タイマーの番号のように画面に出さない値を持つ使い方と、描画の中で読み書きしない注意まで話します。

答えてみる

面接官に「React の useRef はいつ使いますか。useState との違いは何ですか」と聞かれたつもりで、答えを見る前に自分の言葉で答えます。

声に出して答えた人は「書かずに答えを見る」で開けます。

解説を読む

聞かれ方から関連するコースまで、この問いの解説を全部ここに置いています。

こう聞かれます

  • 「useRef は何に使いますか」
  • 「useState と useRef の違いは」
  • 「入力欄にフォーカスを当てるには、どうしますか」

面接官が見ている点

  • ref は current を変えても描き直さない、と言えるか
  • 画面に出す値は state、画面に出さず覚えておくだけの値は ref、と分けられるか
  • DOM の要素に直接触る場面 (フォーカス、スクロール、大きさを測る) を挙げられるか
  • 描画の中で ref を読み書きしない、という決まりを知っているか

短い答え

  • useRef は、描き直しをまたいで値を覚えておく箱を作ります。current を書き換えても、描き直しは起きません。
  • 画面に出す値は useState、画面に出さず覚えておくだけの値は useRef に入れます。setInterval の番号や、前の値の控えなどが ref に向きます。
  • もう 1 つの使い方は DOM の要素を指すことで、ref を JSX の ref に渡すと、要素にフォーカスを当てる、スクロールさせる、大きさを測るといった操作ができます。

この問いを含む分野をレッスンで練習する

レッスンを開く

少し詳しい答え

state と ref の違い

useStateuseRef
変えると描き直すか描き直す描き直さない
変え方set 関数を呼ぶcurrent に代入する
新しい値が見えるのは次の描画代入したすぐ後
向いている値画面に出す値画面に出さない値、DOM の要素

画面に出さない値を持つ

TypeScript (JSX)

function Stopwatch() {
  const [seconds, setSeconds] = useState(0);
  const timerId = useRef<number | null>(null); // 画面に出さないので ref

  function start() {
    if (timerId.current !== null) window.clearInterval(timerId.current); // 二重に動かさない
    timerId.current = window.setInterval(() => setSeconds((s) => s + 1), 1000);
  }
  function stop() {
    if (timerId.current !== null) window.clearInterval(timerId.current);
    timerId.current = null;
  }

  return (
    <>
      <p>{seconds} 秒</p>
      <button onClick={start}>開始</button>
      <button onClick={stop}>停止</button>
    </>
  );
}

timerId を普通の変数にすると、描き直すたびに消えてしまいます。state にすると、番号を覚えるだけで余計に描き直します。

DOM の要素に触る

TypeScript (JSX)

function SearchBox() {
  const inputRef = useRef<HTMLInputElement>(null);
  return (
    <>
      <input ref={inputRef} />
      <button onClick={() => inputRef.current?.focus()}>検索欄へ</button>
    </>
  );
}

React 19 からは、自分で作った関数のコンポーネントでも ref を props として受け取れます。それより前の版では forwardRef で包む必要がありました。

描画の中で読み書きしない

ref は描き直しの合図にならないので、描画の中で ref.current を読んで画面を作ると、値を変えても画面に出ません。ref の読み書きは、イベントの処理か useEffect の中で行います。画面に出したい値なら state にします。

よくある間違い

  • 画面に出す値を ref に入れる変えても描き直されず、画面が古いままです。state にします
  • 描画の中で ref.current を書き換える描画は何度呼ばれても同じ結果を返す決まりです。イベントの処理か useEffect で書き換えます
  • 何でも ref で DOM を直接書き換える React の描く結果とずれます。文字や表示の切り替えは state で書き、ref はフォーカスや測定のような React が持たない操作に使います

深掘りの問い

  • 「前回の描画の値と比べたいときは」前の値を state に持ち、描画の中で今の値と違えば、その state を更新して比べる、と答えます。描画の中で ref.current を読み書きする書き方は使いません
  • 「最初に表示されたときに、入力欄へフォーカスするには」 autoFocus を使うか、useEffect の中で ref の focus を呼ぶ、と答えます
  • 「setTimeout の中で最新の state を読みたいときは」更新関数を使うか、最新の値を ref にも入れておいて読む、と答えます

出典

確認日 2026年10月28日書き手 小尾 知希 (講師)

技術面接問題の一覧へ戻る