Chapter 6: Props
コンポーネントをそのまま再利用すると,同じ内容しか表示できません。ここではコンポーネントにデータを渡す仕組みである Props(プロップス) を理解し,柔軟に見た目を変えられるようにしましょう。
Props はコンポーネントの「引数」
HTML の属性が要素の振る舞いを変えるように,React コンポーネントにも外部から値を渡せます。その値をまとめたオブジェクトが props です。
function Header() {
return <h1>Develop. Preview. Ship.</h1>;
}
function HomePage() {
return (
<div>
<Header />
<Header />
</div>
);
}
このままでは 2 つの <Header /> は同じ内容を描画します。そこで title という props を渡してみましょう。
props を受け取る
コンポーネントは関数なので,引数として props を受け取ります。
function Header(props) {
console.log(props); // { title: "React" }
return <h1>Develop. Preview. Ship.</h1>;
}
props はオブジェクトです。分割代入を使って取り出すとコードが読みやすくなります。
<h1> の中身を title に差し替える場合は {} で囲んで JSX 内から JavaScript を参照します。
{} の中には式(最終的に値が 1 つに決まるもの)であれば何でも書けます。テンプレートリテラルや関数の戻り値も利用可能です。
function Header({ title }) {
const label = title ? `Cool ${title}` : 'Default title';
return <h1>{label}</h1>;
}
Props で再利用性を高める
同じコンポーネントでも渡す props を変えるだけで出力を切り替えられます。
function HomePage() {
return (
<div>
<Header title="React" />
<Header title="A new title" />
</div>
);
}
このとき title が渡されない場合に備えて,デフォルト値を用意しておくと親コンポーネントの記述ミスにも対応できます。
配列を描画する(リストレンダリング)
現実のアプリでは配列データをまとめて表示したい場面が多くあります。map() を使うと配列の各要素から JSX を生成できます。
function HomePage() {
const names = ['Ada Lovelace', 'Grace Hopper', 'Margaret Hamilton'];
return (
<div>
<Header title="Develop. Preview. Ship." />
<ul>
{names.map((name) => (
<li key={name}>{name}</li>
))}
</ul>
</div>
);
}
key props を忘れずに
React はリストの各要素を識別するために key を必要とします。今回のように配列の値が一意であればそのまま使えますが、実務では ID など衝突しない値を選びましょう。
{} を使って JSX と JavaScript を行き来しながら、柔軟な表示ができるようになると React の表現力が一気に広がります。
参考リンク
次の章では,コンポーネントの内部で変化するデータ State を扱い,インタラクティブな UI を作っていきます。