【入門編】 forwardRefによるrefの転送 – React実践ガイド

こんにちは。Reactの世界へようこそ!
日々、コードと格闘していると「なんでこんなに動かないの?」と壁にぶつかること、ありますよね。大丈夫、みんな最初はそうやって強くなるんです。

今日は、Reactを触り始めると必ずと言っていいほど「あれ、どうすればいいの?」と手が止まる`forwardRef`(フォワードレフ)という機能についてお話しします。

—

そもそも「ref」って何者?

まずは少しだけ整理しましょう。Reactは基本的に「データの流れ」で画面を動かします。でも、たまには「どうしても直接このボタンにフォーカスを当てたい!」とか「この動画プレイヤーの再生ボタンを直接叩きたい!」というように、DOM(画面上のHTML要素)を直接操作したい時がありますよね。

その時に使うのが`ref`という、「その要素への直接の連絡先(アドレス帳)」のようなものです。

なぜ「転送(forward)」が必要なの?

普通、`ref`は同じコンポーネント内なら自由に作れます。でも、「親コンポーネントで作った『連絡先』を、子コンポーネントの中にあるボタンに渡したい」という状況になったとき、Reactは少しだけ意地悪をします。

Reactの決まりとして、コンポーネントは「中身がどうなっているか」を隠すのが基本ルールです。だから、親から`ref`という名前のプロパティを渡しても、子コンポーネントは「え、この`ref`って何? 受け取り方がわからないよ」と無視してしまうんです。

ここで登場するのが`forwardRef`です。
これは、「親からもらった『連絡先(ref)』を、子コンポーネントの中の特定の要素まで直接つないであげますよ」という、いわば「取次サービス」なんです。

—

具体的に見てみよう:入力フォームの例

例えば、親画面に「入力するボタン」があって、クリックすると子コンポーネント内の「テキストボックス」にカーソルがピコピコッと入る機能を考えてみましょう。

1. 子コンポーネント側(受け取る準備)

`forwardRef`を使って、親から送られてくる`ref`を受け取れるようにします。

import React, { forwardRef } from ‘react’;

// forwardRefで囲むことで、第二引数にrefを受け取れるようになります
const MyInput = forwardRef((props, ref) => {
return (
// 親から受け取ったrefを、このinputタグに直接紐付けます

);
});

export default MyInput;

2. 親コンポーネント側(渡す側)

`useRef`で作った「連絡先」を、子コンポーネントに渡します。

import React, { useRef } from ‘react’;
import MyInput from ‘./MyInput’;

const App = () => {
// 連絡先(ref)を作成
const inputRef = useRef(null);

const handleClick = () => {
// 連絡先を通じて、子コンポーネント内のinputを操作!
inputRef.current.focus();
};

return (

{/ ref属性を使って、作成した連絡先を渡す /}

);
};

—

ここで注意!「設計」の視点から

この`forwardRef`、とっても便利ですが、使いすぎには注意が必要です。

現場の設計でよくある「うっかり」ポイントを3つだけお伝えしますね。

1. カプセル化を壊しすぎない:
Reactの良さは「中身を隠して、部品として使い回せること」です。むやみに`ref`で中身を操作できるようにしてしまうと、後から「中身のHTMLタグの種類を変えたい」と思った時に、親側のコードまで壊れてしまいます。「本当にこれ、親から触らせる必要がある?」と一度立ち止まって考えてみてください。
2. `ref`は最後の手段:
Reactの基本は「状態(state)を変えることで画面を変える」ことです。`ref`はあくまで「どうしても直接操作が必要なとき(フォーカス、スクロール位置の取得など)」の特効薬として使いましょう。
3. 過度な依存を避ける:
子コンポーネントの構造が複雑すぎると、どこに`ref`を紐づければいいか迷子になります。そんな時は、「このコンポーネントは役割が大きすぎるのかも?」と分割のサインかもしれません。

—

最後に:あまり難しく考えないで

「転送」とか「DOM操作」という言葉を聞くと、なんだか凄そうな魔法のように感じるかもしれません。でも、やっていることは単純に「親が持っている手紙(ref)を、子の中の特定の誰か(DOM要素)に手渡しているだけ」なんです。

最初から完璧に使いこなす必要はありません。まずは「あれ、親からrefが渡せないな?」と思った時に、「あ、そういえば`forwardRef`っていう魔法の道具があったな」と思い出してもらえれば大正解です。

皆さんのReactライフが、少しでも快適で楽しいものになりますように!応援しています。

コメント

タイトルとURLをコピーしました