Day 1・JSXとコンポーネント — 部品を作って渡す
props — 親から子へデータを渡す
propsは親コンポーネントから子へデータを渡す仕組み(関数の引数のようなもの)。同じ部品に違うデータを渡して再利用する感覚と、ハードコードとの違いをつかむ。
部品に「材料」を渡したい
ヘッダーのように中身が固定の部品もありますが、『名前だけ違うカード』のように、形は同じで中身だけ変えたい部品もあります。このとき使うのがpropsです。propsは、親コンポーネントから子コンポーネントへデータを渡す仕組みで、関数の引数によく似ています。
// 渡す側(親)
function App() {
return <UserCard name="太郎" />;
}受け取る側の子コンポーネントは、引数としてpropsを受け取ります。よく使うのは、必要な値だけを{ }で取り出す『分割代入』の書き方です。{ name }と書けば、渡されたnameをそのまま使えます。
// 受け取る側(子)
function UserCard({ name }: { name: string }) {
return <div className="card">ようこそ、{name} さん</div>;
}同じ部品に違うデータ = 再利用
propsの本当のうれしさは再利用です。同じUserCardに違うnameを渡すだけで、何枚でも違うカードを作れます。部品は1つ、データは何通りでも。これが『部品化』のごほうびです。
function App() {
return (
<div>
<UserCard name="太郎" />
<UserCard name="花子" />
<UserCard name="次郎" />
</div>
);
}なぜハードコードせず props にするのか
『太郎』と直接書いた(ハードコードした)カードは、花子さん用にはもう1つ丸ごと作り直すしかありません。propsにしておけば、部品はそのまま、渡す値を変えるだけ。変更が1か所で済み、間違いも減ります。『変わるところを外から渡せるようにする』のが再利用の基本です。
ハードコード(再利用できない)
function TaroCard() {
return <div className="card">ようこそ、太郎 さん</div>;
}
// 花子さん用にはまた別の部品が必要...props化(何度でも再利用)
function UserCard({ name }: { name: string }) {
return <div className="card">ようこそ、{name} さん</div>;
}
// <UserCard name="花子" /> のように渡すだけchildren: タグで挟んだ中身も渡せる
もう1つ、childrenという特別なpropsがあります。<Box>ここが中身</Box>のように開始タグと終了タグで挟んだものは、childrenとして子コンポーネントに届きます。今は『タグで囲んだ中身も渡せる』とだけ知っておけば十分です。
function Box({ children }: { children: React.ReactNode }) {
return <div className="box">{children}</div>;
}
// 使う側: <Box>ここが中身になる</Box>props は上書きしない
propsは親から受け取った値で、子の中で書き換えてはいけません(name = "別の名前" のように代入しない)。propsは『親から子への一方通行の手渡し』です。子で値を変えたいときは、Day2で学ぶstateという別の仕組みを使います。まずは『propsは読むだけ』と覚えておきましょう。
AIにはこう聞く
「このコンポーネントはどんなpropsを受け取っている?それぞれの型と、親からどう渡されているかを日本語で説明して。ハードコードされている値があれば、propsにすべきか意見も教えて」と聞くと、再利用の勘所がつかめます。
読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
propsの説明として最も適切なものはどれですか。
同じ内容のカードを名前だけ変えて何枚も表示したいとき、最も適切なのはどれですか。
「値をハードコードするのではなくpropsにする」利点を、初心者にも伝わるように説明してください。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。