●目次
useRef
は、コンポーネント内でデータを保持したり、DOM要素に直接アクセスしたりするのに非常に便利なフックです。
useRef
とは?
useRef
は、「参照(Reference)」を作成するためのフックです。
通常、状態管理にはuseState
を使いますが、useRef
は再レンダリングを発生させずにデータを保持したい場合に使います。
- 再レンダリングを引き起こさない:
useRef
で保持した値が変化しても、コンポーネントは再レンダリングされません。 .current
プロパティ:useRef
はオブジェクトを返し、その中の.current
プロパティに値を保持します。
useRef
とuseState
の違い
useRef | useState |
---|---|
再レンダリングしない | 再レンダリングする |
ref.current (値)を直接更新 | セッター関数を使用して 値を更新 |
用途: ・値の保持 ・DOM操作 | 用途: ・状態管理 ・画面の再描画 |
useRefの基本的な使い方
useRef(0)
:
初期値を0
に設定した参照を作成します。countRef.current
:
現在の値を取得または更新します。- コンソールにクリック回数が表示されますが、画面上の表示は変わりません。
App.jsx
import React, { useRef } from 'react';
function App() {
const countRef = useRef(0);
const handleClick = () => {
countRef.current += 1;
console.log(`クリック回数: ${countRef.current}`);
};
return (
<div>
<button onClick={handleClick}>クリックしてね!</button>
</div>
);
}
export default App;
useRefでDOM要素へのアクセス
useRef
は、直接DOM要素にアクセスしたい場合にも使われます。
<input ref={inputRef} />
:input
要素に参照を設定します。inputRef.current.focus()
:input
要素にフォーカスを当てます。
App.jsx
import React, { useRef } from 'react';
function App() {
const inputRef = useRef(null);
const focusInput = () => {
inputRef.current.focus();
};
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={focusInput}>フォーカスを当てる</button>
</div>
);
}
export default App;
実践的な例:タイマーの作成
Timer.jsx
import React, { useRef, useState } from 'react';
function Timer() {
const [time, setTime] = useState(0);
const timerRef = useRef(null);
// タイマーを開始する関数
const startTimer = () => {
if (timerRef.current !== null) return;
timerRef.current = setInterval(() => {
setTime((prev) => prev + 1);
}, 1000);
};
// タイマーを停止する関数
const stopTimer = () => {
clearInterval(timerRef.current);
timerRef.current = null;
};
return (
<div>
<h1>時間: {time}秒</h1>
<button onClick={startTimer}>開始</button>
<button onClick={stopTimer}>停止</button>
</div>
);
}
export default Timer;
setInterval()
:
指定した時間間隔(ミリ秒)ごとに関数を繰り返し実行します。
ここでは1000
ミリ秒(1秒)ごとにsetTime
を呼び出しています。- 返り値:
setInterval
はタイマーIDを返します。
このIDは後でタイマーを停止するために使用します。
- 返り値:
timerRef.current = setInterval(() => {
setTime((prevTime) => prevTime + 1);
}, 1000);
clearInterval()
:setInterval
で設定したタイマーを停止します。- 引数:
setInterval
の返り値であるタイマーIDを指定します。
- 引数:
clearInterval(timerRef.current);