TypeScriptでReactのrefsを使う方法
ReactでTypeScriptとrefsを使用する方法の日本語解説
refsはReactのコンポーネント内でDOM要素や他のコンポーネントへの参照を取得するための仕組みです。TypeScriptと組み合わせて使うことで、型安全な方法でrefsを扱うことができます。
refsの作成と使用
-
useRef
フックを使用してrefsを作成します。- ジェネリック型で参照したい要素の型を指定します。
import { useRef } from 'react'; const MyComponent = () => { const inputRef = useRef<HTMLInputElement>(null); return ( <div> <input ref={inputRef} type="text" /> </div> ); };
-
ref
プロパティを使用してrefsを要素に関連付けます。current
プロパティを使用してrefsが参照する要素にアクセスします。
const handleClick = () => { if (inputRef.current) { inputRef.current.focus(); } };
型安全なrefsの使い方
- nullチェック
current
プロパティは初期状態ではnull
です。アクセスする前にnull
チェックを行い、エラーを防ぎます。 - ジェネリック型
useRef
フックのジェネリック型を使用して、参照する要素の型を指定します。これにより、TypeScriptが型チェックを行い、誤った操作を防ぎます。
具体的な例
import { useRef, useState } from 'react';
const MyComponent = () => {
const inputRef = useRef<HTMLInputElement>(null);
const [inputValue, setInputValue] = useState('');
const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setInputVa lue(event.target.value);
};
const handleSubmit = () => {
if ( inputRef.current) {
console.log(inputRef.current.value);
}
};
return (
<div>
<input ref={inputRef} type="text" value={inputValue} onChange={handleInputChange} />
<button onClick={handleSubmit}>Submit</button>
</div>
);
};
TypeScriptでReactのrefsを使う方法のコード解説
import { useRef } from 'react';
const MyComponent = () => {
const inputRef = useRef<HTMLInputElement>(null);
return (
<div>
<input ref={inputRef} type="text" />
</div>
);
};
- ジェネリック型
<HTMLInputElement>
は参照する要素の型を指定します。 - useRefフック
useRef
フックを使用してrefsを作成します。
const handleClick = () => {
if (inputRef.current) {
inputRef.current.focus();
}
};
import { useRef, useState } from 'react';
const MyComponent = () => {
const inputRef = useRef<HTMLInputElement>(null);
const [inputValue, setInputValue] = useState('');
const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setInputVa lue(event.target.value);
};
const handleSubmit = () => {
if ( inputRef.current) {
console.log(inputRef.current.value);
}
};
return (
<div>
<input ref={inputRef} type="text" value={inputValue} onChange={handleInputChange} />
<button onClick={handleSubmit}>Submit</button>
</div>
);
};
- 型安全
TypeScriptのジェネリック型とnull
チェックにより、型安全な方法でrefsを扱っています。 - フォームの送信
handleSubmit
関数を使用してフォームを送信します。 - 入力値の管理
inputValue
状態を使用して入力値を管理します。 - 入力要素の参照
inputRef
を使用して入力要素への参照を取得します。
useCallbackフックの使用
- 方法
useCallback
フックを使用して、refsを返す関数をメモ化します。これにより、関数の参照が変わらない限り、再レンダリング時に関数が再作成されません。 - 目的
頻繁に再レンダリングされるコンポーネント内でrefsを関数として渡す場合、パフォーマンスを向上させるためにuseCallback
フックを使用します。
import { useRef, useCallback } from 'react';
const MyComponent = () => {
const inputRef = useRef<HTMLInputElement>(null);
const handleFocus = useCallback(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, []);
return (
<div>
<input ref={inputRef} type="text" onFocus={handleFocus} />
</div>
);
};
forwardRef高階コンポーネントの使用
- 方法
forwardRef
高階コンポーネントを使用して、子コンポーネントをラップし、refsを子コンポーネントに渡します。 - 目的
refsを子コンポーネントに渡す場合、forwardRef
高階コンポーネントを使用します。
import { forwardRef } from 'react';
const MyInput = forwardRef<HTMLInputElement, { value: string; onChange: (event: React.ChangeEvent<HTMLInputElement>) => void }>((props, ref) => {
return (
<input ref={ref} {...props} />
);
});
const MyComponent = () => {
const inputRef = useRef<HTMLInputElement>(null);
return (
<div>
<MyInput ref={inputRef} value="Hello" onChange={(event) => console.log(event.target.value)} />
</div>
);
};
カスタムフックの使用
- 方法
カスタムフックを作成し、refsを管理するロジックを実装します。 - 目的
refsを複数のコンポーネントで共有する場合、カスタムフックを使用してrefsを管理します。
import { useRef } from 'react';
function useInputRef<T extends HTMLElement>() {
const ref = useRef<T>(null);
return ref;
}
const MyComponent = () => {
const inputRef = useInputRef<HTMLInputElement>();
return (
<div>
<input ref={inputRef} type="text" />
</div>
);
};
reactjs typescript