🐤 はじめに
Component の定義のセオリーを知るために、最近デジタル庁の Storybook のリポジトリ を見ています。
今回はその中で初めてみたforwardRef
と、名前は知ってたけど使ったことがなかったuseRef
について調べました。
見ていたのはButtonです
先に書いておきますが、forwardRef
は React19 から非推奨です。
React19 以降は props で ref を使えるらしいので、そちらを使うのが良いでしょう。
✅️ この記事でわかること
forwardRef
ってなに?useRef
ってなに?- React19 から
forwardRef
は非推奨らしいけど、Next.js では?
🔍️ forwardRef ってなに?
React 公式ページ:forwardRef
React 19 では、
forwardRef
は不要となりました。代わりに props としてref
を渡すようにしてください。
React19 からは非推奨になっているみたいですね。
🐤「知るのが遅かったか……」
forwardRef
は、親コンポーネントに対して DOM ノードを ref として公開できるようにします。
🐤「そもそもref
があるとなにが嬉しいんだろう……?」
🤔 そもそも useRef
もあんまわかってない
ということで一旦useRef
を調べてみました。
React 公式ページ:useRef
render に使用しない値の管理に使う?
ボタンを押したらアラートで表示するクリック回数が例に出ていました。
▶ useRef を用いて値を参照する使用例 > 例 1/2: クリックカウンタ
ref の値の変更で再 render が走らない
useRef
の値が変更されても再 render は走らないそうです。
そのため、表示に用いない値を保存することに使用されるみたいです。
例えばuseRef を用いて値を参照する使用例 > 例 1/2: クリックカウンタ なら、button をクリックした時にalert
でクリック回数を表示しています。
これは render には使用されておらず、alert
の文字列に渡す場合のみ使用されています。
🐤「他で render に使わない場合はuseState
ではなく、useRef
を使うと再 render が走らないので良い、ということみたいですね」
逆に、値が変わっても再 render が走らないので、render に使用するなら useState
を使う必要があります。
render で使用する値なのかどうかがuseState
とuseRef
どちらを使うかの判断基準になりそうです。
DOM 操作でよく使う?
上記のようなForm
Component では、useRef
のinputRef
オブジェクトにinput
の参照が入ります。
そして、button
をクリックするとinputRef.current.focus();
によってinputRef
に入っている参照、すなわちinput
要素に focus される、ということみたいです。
こういった使い方でよく使用されるのが、useRef
とref
らしいですね。
💡 改めて forwardRef ってなに?
「独自定義の Component には通常は ref={hogeRefObject}
が渡せない ⇒ 親に独自定義 Component 内の要素を公開できない」
ということでforwardRef
が登場するみたいです。
▼ こういう感じで Component を定義(引用:React の forwardRef はなぜ必要で、いつ使うべきか)
▼ のような感じで使用できるらしい
Form
のref
オブジェクトにMyInput
のinput
の参照が入るForm
のbutton
がクリックされると、ref
に focusref
には「MyInput
のinput
の参照」が入っているので、「MyInput
のinput
の参照」に focus
ということができるみたいです!
⚠️ React19 から forwardRef は非推奨になるらしい
React19 からは関数 Component で ref に props としてアクセスできるようになるようです。
今回forwardRef
が登場する要因となっていた「独自定義の Component 内の要素にアクセスできる ref」というものが、
そもそも props でできるようになるので、不要になるということみたいですね。
今後、DOM 操作などで独自定義 Component にref
を渡したくなったら、props に渡せば良いみたいです!
▼ ref
が props により
⚛️ Next.js で React19 は使える?
最近、Next.js を触っているので、気になって調べてみました。
結論として、 Next.js 15.1 から使えるみたいです!
▶ Next.js 15.1 > React 19 (安定版)
Next.js で DOM 操作をしたい時も 15.1 以上であれば、 forwardRef を使わなくてよさそうですね!
🐤 まとめ
forwardRef
ってなに?- 独自定義 Component に
ref
を渡せるようにすることができるもの - ただ、React19 からは非推奨になる
- React19 からは props で
ref
を渡せるようになるので、そちらの手段を使う!
- 独自定義 Component に
useRef
ってなに?- この値が変更されても、再 render が走らない
- ↑ を利用して、render に使用しない(再 render される必要がない)値の管理に使用される
- 特に、DOM 操作のために
ref
を使う場合によく使われる button
がクリックされたら、ref
で参照できるようにした別の DOM(例えばinput
)に focus する、というようなことができる!
- React19 から
forwardRef
は非推奨らしいけど、Next.js では?- Next.js の 15.1 以上で React19 に対応済
- Next.js15.1 以上を使用する場合は、
forwardRef
ではなく、props に渡せば良い!
記事に関係ない話
最近、ChatGPT に絵文字をたくさん使ってもらうのにハマっています。
かわいいな、と思って絵文字をたくさん使って賑やかにしてもらっています。
今回はせっかくなので記事の見出しに絵文字をつけてみました。
Noto Color Emojiを使うようにしたらもっとかわいくなるんでしょうか?
検討中です!