useRef とは?
Reactのフックの一つで:
「**ある値を記憶するための箱(オブジェクト)**を作る」
ようなものです。
書き方(基本構文)
import { useRef } from "react";
const ref = useRef(initialValue);
-
initialValueは初期値(省略可) -
ref.currentに値が入る(変更しても再レンダリングされない)
✳️ 主な使い道 2パターン
① DOMを直接触る(主用途)
例:入力欄にボタンでフォーカスを当てたい
import { useRef } from "react";
const Example = () => {
const inputRef = useRef();
const handleClick = () => {
inputRef.current.focus(); // DOMのfocus()を呼ぶ!
};
return (
<div>
<input ref={inputRef} type="text" placeholder="ここにフォーカス" />
<button onClick={handleClick}>フォーカスする</button>
</div>
);
};
解説:
-
useRef()で作ったinputRefを<input ref={inputRef}>に渡すと、DOMが取得できる -
inputRef.currentにその DOM 要素(inputタグ)が入ってる -
inputRef.current.focus()でフォーカスできる!
② 値を保持する(再レンダリングさせたくないとき)
例:前回のカウント値を保持する
import { useRef, useState, useEffect } from "react";
const Example = () => {
const [count, setCount] = useState(0);
const prevCount = useRef(0);
useEffect(() => {
prevCount.current = count;
}, [count]);
return (
<div>
<p>今のカウント: {count}</p>
<p>前のカウント: {prevCount.current}</p>
<button onClick={() => setCount(count + 1)}>+1</button>
</div>
);
};
解説:
-
prevCount.currentに前回のcountを記録 - 値を更新しても 再レンダリングされない
-
useRefは「永続的なメモ帳」のような使い方もできる
useRef vs useState の違い
| 比較項目 | useRef |
useState |
|---|---|---|
| 値の更新で再レンダリング? | ❌ されない | ✅ 再レンダリングされる |
| DOM参照に使える? | ✅ できる | ❌ できない(HTMLには渡せない) |
| 値の保持目的 | ✅ 一時的・永続的どちらもOK | ✅ UIに影響を与える状態を管理するため |
よくある使い道まとめ
| 用途 | 例 |
|---|---|
| DOM参照 | inputRef.current.focus() |
| setTimeout の ID を保持 | timeoutRef.current = setTimeout(...) |
| 前回の値を覚えておく | prevCount.current = count |
| スクロール位置・ビデオ制御など | videoRef.current.play() |
まとめ
-
useRef()は、DOM要素 or 値を保持するために使う -
.currentにアクセスする - 値が変わっても再レンダリングはされない
- フォーカス、スクロール、前回の値保持などに便利