🔍

useRefの種類

2022/09/21に公開

useRef には 2 種類の用途がある。
https://ja.reactjs.org/docs/hooks-reference.html#useref

  1. DOM の参照
  2. 値の保持

である。

定義するタイミングで使い分ける。

// React.MutableRefObject<undefined>
const ref1 = useRef();

// React.MutableRefObject<null>
const ref2 = useRef(null);

// React.MutableRefObject<HTMLDivElement | undefined>
const ref3 = useRef<HTMLDivElement>();

// React.RefObject<HTMLDivElement>
const ref4 = useRef<HTMLDivElement>(null);

上記の通り、

  • 1, 2, 3 は MutableRefObject
  • 4 は RefObject

型と推論される。

4 の RefObject が DOM の参照に使うものであり、その他が値の保持に使うものである。

特徴1

Mutable でない RefObject 型の ref は値を代入できない。

ref4.current = null; 
// Cannot assign to 'current' because it is a read-only property.

DOM の参照に使う ref をユーザーが変更する必要はないため readonly であるのが自然だろう。

特徴2

初期値に null を指定していない 1,3 のパターンは DOM 要素の ref に指定するとエラーになる。

<div ref={ref1} />
// Type 'MutableRefObject<undefined>' is not assignable to type 'LegacyRef<HTMLDivElement> | undefined'.

<div ref={ref3} /> 
// Type 'MutableRefObject<HTMLDivElement | undefined>' is not assignable to type 'LegacyRef<HTMLDivElement> | undefined'.

まとめ

DOM 要素の参照に使う場合は、

const ref = useRef<HTMLDivElement>(null);

のように、

  • Element 型の指定
  • 初期値に null

を指定しよう!

※今回の記事の内容を codesandbox に作成したので実際に触りたいときにどうぞ。

参考文献

https://zenn.dev/berlysia/articles/624bc1aaffda58#インスタンス変数代わりに使うとき

GitHubで編集を提案

Discussion