概要: このチュートリアルでは、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
要素に直接アクセスし、不要な再レンダリングを引き起こすことなく可変状態を管理します。