R初めてのReact

Day 1JSXとコンポーネント — 部品を作って渡す

props — 親から子へデータを渡す

propsは親コンポーネントから子へデータを渡す仕組み(関数の引数のようなもの)。同じ部品に違うデータを渡して再利用する感覚と、ハードコードとの違いをつかむ。

部品に「材料」を渡したい

ヘッダーのように中身が固定の部品もありますが、『名前だけ違うカード』のように、形は同じで中身だけ変えたい部品もあります。このとき使うのがpropsです。propsは、親コンポーネントから子コンポーネントへデータを渡す仕組みで、関数の引数によく似ています。

TSX
// 渡す側(親)
function App() {
  return <UserCard name="太郎" />;
}
<UserCard /> に name="太郎" と属性のように書いて、データを渡している。

受け取る側の子コンポーネントは、引数としてpropsを受け取ります。よく使うのは、必要な値だけを{ }で取り出す『分割代入』の書き方です。{ name }と書けば、渡されたnameをそのまま使えます。

TSX
// 受け取る側(子)
function UserCard({ name }: { name: string }) {
  return <div className="card">ようこそ、{name} さん</div>;
}
引数の { name } で props の name を受け取り、JSX の {name} で表示している。

同じ部品に違うデータ = 再利用

propsの本当のうれしさは再利用です。同じUserCardに違うnameを渡すだけで、何枚でも違うカードを作れます。部品は1つ、データは何通りでも。これが『部品化』のごほうびです。

TSX
function App() {
  return (
    <div>
      <UserCard name="太郎" />
      <UserCard name="花子" />
      <UserCard name="次郎" />
    </div>
  );
}
同じUserCardにnameを変えて渡すだけで3枚のカードができる。

なぜハードコードせず props にするのか

『太郎』と直接書いた(ハードコードした)カードは、花子さん用にはもう1つ丸ごと作り直すしかありません。propsにしておけば、部品はそのまま、渡す値を変えるだけ。変更が1か所で済み、間違いも減ります。『変わるところを外から渡せるようにする』のが再利用の基本です。

ハードコード(再利用できない)

TSX
function TaroCard() {
  return <div className="card">ようこそ、太郎 さん</div>;
}
// 花子さん用にはまた別の部品が必要...

props化(何度でも再利用)

TSX
function UserCard({ name }: { name: string }) {
  return <div className="card">ようこそ、{name} さん</div>;
}
// <UserCard name="花子" /> のように渡すだけ

children: タグで挟んだ中身も渡せる

もう1つ、childrenという特別なpropsがあります。<Box>ここが中身</Box>のように開始タグと終了タグで挟んだものは、childrenとして子コンポーネントに届きます。今は『タグで囲んだ中身も渡せる』とだけ知っておけば十分です。

TSX
function Box({ children }: { children: React.ReactNode }) {
  return <div className="box">{children}</div>;
}

// 使う側: <Box>ここが中身になる</Box>
タグで挟んだ中身が children として渡り、{children} の位置に表示される。

props は上書きしない

propsは親から受け取った値で、子の中で書き換えてはいけません(name = "別の名前" のように代入しない)。propsは『親から子への一方通行の手渡し』です。子で値を変えたいときは、Day2で学ぶstateという別の仕組みを使います。まずは『propsは読むだけ』と覚えておきましょう。

AIにはこう聞く

「このコンポーネントはどんなpropsを受け取っている?それぞれの型と、親からどう渡されているかを日本語で説明して。ハードコードされている値があれば、propsにすべきか意見も教えて」と聞くと、再利用の勘所がつかめます。

読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。

理解度チェック

答えられれば、面接で説明できる状態に一歩近づきます。

Q1

propsの説明として最も適切なものはどれですか。

Q2

同じ内容のカードを名前だけ変えて何枚も表示したいとき、最も適切なのはどれですか。

Q3

「値をハードコードするのではなくpropsにする」利点を、初心者にも伝わるように説明してください。

記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。