概要: このチュートリアルでは、ReactのuseRefフックを使用して、DOM要素に直接アクセスする方法と、レンダリング間で値を保持する方法について学びます。
React useRefフックの紹介
Reactでは、useRefフックを使用すると、プレーンなJavaScriptのdocument.querySelector()のように、DOM要素に直接アクセスできます。さらに、useRefフックを使用すると、再レンダリングを引き起こすことなく状態を変更できます。
useRefフックを使用する手順は次のとおりです。
ステップ1。ReactからuseRefをインポート
import React, { useRef } from 'react';Code language: JavaScript (javascript)ステップ2。refオブジェクトの作成
初期値を持つuseRef()関数を呼び出して、refオブジェクトを作成します
const myRef = useRef(initialValue);Code language: JavaScript (javascript)useRef()関数の戻り値は、可変オブジェクトMyRefです。
つまり、refの値を更新しても、再レンダリングは発生しません。これがuseRefフックとuseStateフックの主な違いです。
ステップ3。refオブジェクトをDOM要素にアタッチします。
DOM要素に直接アクセスする場合は、ref属性を使用してrefをDOM要素にアタッチします
<input ref={myRef} type="text" />Code language: JavaScript (javascript)ステップ4。refオブジェクトを使用します。
イベントハンドラー、useEffectフック、またはコンポーネントのその他の部分で、.currentプロパティを介してrefの現在の値にアクセスします
const handleClick = () => {
console.log(myRef.current.value);
};Code language: JavaScript (javascript)ステップ5。refを更新します
再レンダリングを引き起こすことなく値を変更するには、refオブジェクトの.currentプロパティを更新します
myRef.current = newValue;Code language: JavaScript (javascript)React useRefフックの使用法
実際には、useRef()フックを使用して、DOM要素に直接アクセスしたり、再レンダリングを引き起こすことなく可変オブジェクトを管理したりします。
DOM要素に直接アクセスする
次のコンポーネントは、useRefフックを使用してDOM要素に直接アクセスする方法を示しています
import { useRef } from 'react';
const SubscriberForm = () => {
const inputRef = useRef(null);
const handleClick = () => {
inputRef.current.focus();
};
return (
<div>
<label htmlFor="email">Email:</label>
<input type="email" id="email" ref={inputRef} />
<button type="submit" onClick={handleClick}>
Submit
</button>
</div>
);
};
export default SubscriberForm;
Code language: JavaScript (javascript)SubscriberFormには、入力要素とボタンがあります。ボタンをクリックすると、入力にフォーカスが当たります。
仕組み。
まず、reactからuseRefをインポートします
import { useRef } from 'react';Code language: JavaScript (javascript)次に、初期値がnullのrefオブジェクトを宣言します
const inputRef = useRef(null);Code language: JavaScript (javascript)3番目に、refオブジェクトを入力のref属性にアタッチします
<input type="email" id="email" ref={inputRef} />Code language: JavaScript (javascript)Reactがコンポーネントをレンダリングすると、refオブジェクトのcurrentプロパティが入力(DOMノード)に設定されます。focus()などのDOMノードのメソッドにアクセスできます。
最後に、ユーザーが送信ボタンをクリックしたときに、DOM要素のfocus()メソッドを呼び出して、入力要素にフォーカスを設定します
const handleClick = (e) => {
inputRef.current.focus();
};Code language: JavaScript (javascript)可変値を格納する
次の例は、再レンダリングをトリガーせずに、レンダリング間で永続する可変値を格納するためにrefを使用する方法を示しています
import { useRef } from 'react';
const Counter = () => {
const countRef = useRef(0);
const incrementCount = () => {
countRef.current++;
alert(countRef.current);
};
return <button onClick={incrementCount}>Increment Count</button>;
};
export default Counter;Code language: JavaScript (javascript)仕組み。
まず、reactライブラリからuseRefをインポートします
import { useRef } from 'react';Code language: JavaScript (javascript)次に、初期値が0のuseRef()フックからcountRefを返します
const countRef = useRef(0);Code language: JavaScript (javascript)3番目に、ユーザーがボタンをクリックしたときにrefの値を増やします
const incrementCount = () => {
countRef.current++;
alert(countRef.current);
};Code language: JavaScript (javascript)useRef vs. useStateフック
次の表は、useRefフックとuseStateフックの違いをまとめたものです
| 特徴 | useRef | useState |
|---|---|---|
| 目的 | 再レンダリングを引き起こすことなく可変値を保持すること。 | 更新時に再レンダリングを引き起こす関数型コンポーネントで状態を管理すること。 |
| 初期値 | useRef(initialValue) | useState(initialValue) |
| 戻り値 | .currentプロパティを持つオブジェクト。 | 現在の状態値とそれを更新する関数を持つ配列。 |
| 再レンダリング | .currentが更新されても再レンダリングは発生しません。 | 状態が更新されると再レンダリングが発生します。 |
| ユースケース | DOM要素への直接アクセス、可変値の格納、および以前の値の保持。 | レンダリングに影響を与えるコンポーネントの状態の管理。 |
| 値の永続性 | レンダリング間で永続します。 | レンダリング間で永続します。 |
| 更新方法 | .currentプロパティを直接更新します。 | useStateによって提供されるセッター関数を使用します。 |
| 使用例 | 入力要素へのアクセス: inputRef.current.focus() | カウンター: const [count, |
| 一般的なシナリオ | インスタンス変数の格納、および再レンダリングを必要としない副作用の処理。 | フォーム入力の管理、UI要素の切り替え、およびあらゆる状態データの保持。 |
| 反応性 | 反応性はありません。.currentへの変更はReactによって追跡されません。 | 反応的。状態への変更はコンポーネントの再レンダリングをトリガーします。 |
| リセット動作 | 状態の変更によるリセットはできません。明示的に変更しない限り値を保持します。 | 状態はセッター関数を通じてリセットするか、コンポーネントの再マウント時に再初期化できます。 |
概要
useRef()フックを利用して、DOM要素に直接アクセスし、不要な再レンダリングを引き起こすことなく可変状態を管理します。