6
チャプター6
Propsを使ったデータの表示
ここまでのところ、<Header />
コンポーネントを再利用する場合、毎回同じ内容が表示されます。
function Header() {
return <h1>Develop. Preview. Ship.</h1>;
}
function HomePage() {
return (
<div>
<Header />
<Header />
</div>
);
}
しかし、別のテキストを渡したい場合や、外部ソースからデータを取得しているため、事前に情報がわからない場合はどうすればよいでしょうか。
通常のHTML要素には、要素の動作を変更する情報を渡すために使用できる属性があります。たとえば、<img>
要素のsrc
属性を変更すると、表示される画像が変わります。<a>
タグのhref
属性を変更すると、リンクの移動先が変わります。
同様に、Reactコンポーネントにプロパティとして情報を渡すことができます。これらはprops
と呼ばれます。たとえば、ボタンの考えられるバリエーションを見てみましょう。


JavaScriptの関数と同様に、コンポーネントの動作や画面にレンダリングされたときに表示される内容を変更するカスタム引数(またはprops)を受け入れるコンポーネントを設計できます。そして、これらのpropsを親コンポーネントから子コンポーネントに渡すことができます。
注: Reactでは、データはコンポーネントツリーを下に流れます。これは一方向データフローと呼ばれます。次の章で説明する状態は、propsとして親コンポーネントから子コンポーネントに渡すことができます。
propsの使用
HomePage
コンポーネントでは、HTML属性を渡すように、Header
コンポーネントにカスタムのtitle
propsを渡すことができます。
function HomePage() {
return (
<div>
<Header title="React" />
</div>
);
}
そして、子コンポーネントであるHeader
は、それらのpropsを最初の関数パラメータとして受け取ることができます。
function Header(props) {
return <h1>Develop. Preview. Ship.</h1>;
}
console.log()
でpropsを出力すると、titleプロパティを持つオブジェクトであることがわかります。
function Header(props) {
console.log(props); // { title: "React" }
return <h1>Develop. Preview. Ship.</h1>;
}
propsはオブジェクトなので、オブジェクトの分割代入を使用して、関数パラメータ内でpropsの値を明示的に名前を付けることができます。
function Header({ title }) {
console.log(title); // "React"
return <h1>Develop. Preview. Ship.</h1>;
}
次に、<h1>
タグの内容をtitle変数に置き換えることができます。
function Header({ title }) {
console.log(title);
return <h1>title</h1>;
}
ブラウザでファイルを開くと、実際の単語「title」が表示されていることがわかります。これは、ReactがDOMにプレーンテキスト文字列をレンダリングすることを意図していると考えているためです。
これがJavaScript変数であることをReactに伝える方法が必要です。
JSXで変数を使用する
title
propsを使用するには、中括弧{}
を追加します。これらは特別なJSX構文であり、JSXマークアップの中に通常のJavaScriptを直接記述できます。
function Header({ title }) {
console.log(title);
return <h1>{title}</h1>;
}
中括弧は、「JSXの世界」にいるときに「JavaScriptの世界」に入る方法だと考えることができます。中括弧の中には、任意のJavaScript式(単一の値に評価されるもの)を追加できます。例:
- ドット表記のオブジェクトプロパティ
function Header(props) {
return <h1>{props.title}</h1>;
}
- テンプレートリテラル
function Header({ title }) {
return <h1>{`Cool ${title}`}</h1>;
}
- 関数の戻り値
function createTitle(title) {
if (title) {
return title;
} else {
return 'Default title';
}
}
function Header({ title }) {
return <h1>{createTitle(title)}</h1>;
}
- または三項演算子
function Header({ title }) {
return <h1>{title ? title : 'Default Title'}</h1>;
}
これで、任意の文字列をtitle propsに渡すことができます。また、三項演算子を使用した場合、コンポーネントにデフォルトケースを考慮しているため、title propsをまったく渡さないこともできます。
function Header({ title }) {
return <h1>{title ? title : 'Default title'}</h1>;
}
function HomePage() {
return (
<div>
<Header />
</div>
);
}
これで、コンポーネントは汎用的なtitle propsを受け入れるようになり、アプリケーションのさまざまな部分で再利用できます。必要なのは、title文字列を変更することだけです。
function HomePage() {
return (
<div>
<Header title="React" />
<Header title="A new title" />
</div>
);
}
リストの反復処理
リストとして表示する必要があるデータを持つことはよくあります。配列メソッドを使用してデータを操作し、スタイルは同じだが異なる情報を持つUI要素を生成できます。
次の名前の配列をHomePage
コンポーネントに追加します。
function HomePage() {
const names = ['Ada Lovelace', 'Grace Hopper', 'Margaret Hamilton'];
return (
<div>
<Header title="Develop. Preview. Ship." />
<ul>
{names.map((name) => (
<li>{name}</li>
))}
</ul>
</div>
);
}
次に、array.map()
メソッドを使用して配列を反復処理し、アロー関数を使用して名前をリスト項目にマップできます。
function HomePage() {
const names = ['Ada Lovelace', 'Grace Hopper', 'Margaret Hamilton'];
return (
<div>
<Header title="Develop. Preview. Ship." />
<ul>
{names.map((name) => (
<li>{name}</li>
))}
</ul>
</div>
);
}
「JavaScript」と「JSX」の世界を織り交ぜるために中括弧を使用したことに注意してください。
このコードを実行すると、Reactからkey
propが欠落しているという警告が表示されます。これは、Reactが配列内のアイテムを一意に識別して、DOM内のどの要素を更新するかを把握する必要があるためです。
名前は現在一意であるため、今は名前を使用できますが、アイテムIDのように一意であることが保証されているものを使用することをお勧めします。
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>
);
}
追加のリソース
チャプターを完了しました6
propsを使ってデータを表示する方法を学びました。
これは役に立ちましたか?