<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Props%E3%81%A8Children</id>
	<title>Reactの基礎 - PropsとChildren - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://mochiu.net/index.php?action=history&amp;feed=atom&amp;title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Props%E3%81%A8Children"/>
	<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Props%E3%81%A8Children&amp;action=history"/>
	<updated>2026-07-01T07:14:00Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://mochiu.net/index.php?title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Props%E3%81%A8Children&amp;diff=14473&amp;oldid=prev</id>
		<title>Wiki: ページの作成:「== 概要 == Propsは、Reactにおけるコンポーネント間のデータ通信メカニズムである。&lt;br&gt; 親コンポーネントから子コンポーネントへ一方向にデータを渡すことができ、これを &lt;u&gt;単方向データフロー&lt;/u&gt; と呼ぶ。&lt;br&gt; &lt;br&gt; Propsには、オブジェクト、配列、関数、文字列や数値等のプリミティブ値といった任意のTypeScript値を渡すことができる。&lt;br&gt; 渡されたProp…」</title>
		<link rel="alternate" type="text/html" href="https://mochiu.net/index.php?title=React%E3%81%AE%E5%9F%BA%E7%A4%8E_-_Props%E3%81%A8Children&amp;diff=14473&amp;oldid=prev"/>
		<updated>2026-02-24T23:45:15Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「== 概要 == Propsは、Reactにおけるコンポーネント間のデータ通信メカニズムである。&amp;lt;br&amp;gt; 親コンポーネントから子コンポーネントへ一方向にデータを渡すことができ、これを &amp;lt;u&amp;gt;単方向データフロー&amp;lt;/u&amp;gt; と呼ぶ。&amp;lt;br&amp;gt; &amp;lt;br&amp;gt; Propsには、オブジェクト、配列、関数、文字列や数値等のプリミティブ値といった任意のTypeScript値を渡すことができる。&amp;lt;br&amp;gt; 渡されたProp…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 概要 ==&lt;br /&gt;
Propsは、Reactにおけるコンポーネント間のデータ通信メカニズムである。&amp;lt;br&amp;gt;&lt;br /&gt;
親コンポーネントから子コンポーネントへ一方向にデータを渡すことができ、これを &amp;lt;u&amp;gt;単方向データフロー&amp;lt;/u&amp;gt; と呼ぶ。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Propsには、オブジェクト、配列、関数、文字列や数値等のプリミティブ値といった任意のTypeScript値を渡すことができる。&amp;lt;br&amp;gt;&lt;br /&gt;
渡されたPropsは読み取り専用 (イミュータブル) であり、子コンポーネントから直接変更することはできない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
主な特徴は以下の通りである。&amp;lt;br&amp;gt;&lt;br /&gt;
* 親コンポーネントから子コンポーネントへ一方向にデータが流れる&lt;br /&gt;
* 任意のTypeScript / JavaScript値 (オブジェクト、配列、関数、プリミティブ) を渡せる&lt;br /&gt;
* Propsは読み取り専用であり、受け取ったコンポーネントが変更することはできない&lt;br /&gt;
* 分割代入やデフォルト値の指定により、簡潔に記述できる&lt;br /&gt;
* TypeScriptと組み合わせることで、型安全なコンポーネント設計が可能になる&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Propsの基本 ==&lt;br /&gt;
==== Propsの受け渡し ====&lt;br /&gt;
親コンポーネントは、JSXの属性としてPropsを子コンポーネントへ渡す。&amp;lt;br&amp;gt;&lt;br /&gt;
データは常に親から子へ一方向に流れる。(単方向データフロー)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、&amp;lt;u&amp;gt;Profile&amp;lt;/u&amp;gt; コンポーネントが &amp;lt;u&amp;gt;Avatar&amp;lt;/u&amp;gt; コンポーネントへ &amp;lt;u&amp;gt;person&amp;lt;/u&amp;gt; と &amp;lt;u&amp;gt;size&amp;lt;/u&amp;gt; を渡している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 export default function Profile() {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;Avatar&lt;br /&gt;
          person={{ name: &amp;#039;Lin Lanying&amp;#039;, imageId: &amp;#039;1bX5QH6&amp;#039; }}&lt;br /&gt;
          size={100}&lt;br /&gt;
       /&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;オブジェクトは二重中括弧 &amp;lt;code&amp;gt;{{}}&amp;lt;/code&amp;gt; で、数値は単一の中括弧 &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; で渡す琴に注意する。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== Propsの受け取り ====&lt;br /&gt;
子コンポーネントは、関数の引数として &amp;lt;code&amp;gt;props&amp;lt;/code&amp;gt; オブジェクトを受け取る。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface AvatarProps {&lt;br /&gt;
    person: { name: string; imageId: string };&lt;br /&gt;
    size: number;&lt;br /&gt;
 }&lt;br /&gt;
　&lt;br /&gt;
 function Avatar(props: AvatarProps) {&lt;br /&gt;
    let person = props.person;&lt;br /&gt;
    let size = props.size;&lt;br /&gt;
    // person と size を使用する処理&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
この方法では、&amp;lt;u&amp;gt;props.&amp;lt;プロパティ名&amp;gt;&amp;lt;/u&amp;gt; の形式でアクセスする必要がある。&amp;lt;br&amp;gt;&lt;br /&gt;
より簡潔に記述するためには、[[#分割代入によるPropsの受け取り 次のセクションで説明する分割代入]]を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 分割代入によるPropsの受け取り ==&lt;br /&gt;
==== 分割代入の基本 ====&lt;br /&gt;
関数の引数で分割代入を使用すると、Propsを直接変数として受け取ることができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 // AvatarProps型は上記で定義済み&lt;br /&gt;
 function Avatar({ person, size }: AvatarProps) {&lt;br /&gt;
    // personとsizeが直接利用可能&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;props.person&amp;lt;/u&amp;gt; と記述する代わりに &amp;lt;u&amp;gt;person&amp;lt;/u&amp;gt; と直接参照でき、ソースコードが簡潔になる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== 残余プロパティ ====&lt;br /&gt;
スプレッド構文 &amp;lt;code&amp;gt;...rest&amp;lt;/code&amp;gt; を使用すると、指定したProps以外の残りのPropsをまとめて受け取ることができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface ButtonProps extends React.ButtonHTMLAttributes&amp;lt;HTMLButtonElement&amp;gt; {&lt;br /&gt;
    variant: string;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Button({ variant, ...rest }: ButtonProps) {&lt;br /&gt;
    return &amp;lt;button className={variant} {...rest} /&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* variant&lt;br /&gt;
*: 取り出して使用するProp&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* ...rest&lt;br /&gt;
*: variant以外の全てのPropsをオブジェクトとしてまとめたもの&lt;br /&gt;
*: &amp;lt;u&amp;gt;{...rest}&amp;lt;/u&amp;gt; で子要素にそのまま展開して渡すことができる&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== デフォルト値 ==&lt;br /&gt;
==== 分割代入によるデフォルト値 ====&lt;br /&gt;
分割代入の際に &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; を使用して、Propが渡されなかった場合のデフォルト値を指定できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface AvatarProps {&lt;br /&gt;
    person: { name: string; imageId: string };&lt;br /&gt;
    size?: number;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 function Avatar({ person, size = 100 }: AvatarProps) {&lt;br /&gt;
    // sizeが指定されない場合、または undefined の場合、100がデフォルト値として使用される&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
デフォルト値が適用される条件と適用されない条件を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ デフォルト値の適用条件&lt;br /&gt;
! 渡される値 !! デフォルト値の適用&lt;br /&gt;
|-&lt;br /&gt;
| 指定なし (Propが存在しない) || 適用される&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; || 適用される&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; || 適用されない (nullのまま)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || 適用されない (0のまま)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; || 適用されない (falseのまま)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== children ==&lt;br /&gt;
==== childrenの基本 ====&lt;br /&gt;
JSXタグ内にネストされたコンテンツは、自動的に &amp;lt;code&amp;gt;children&amp;lt;/code&amp;gt; Propとして子コンポーネントへ渡される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface CardProps {&lt;br /&gt;
    children: React.ReactNode;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Card({ children }: CardProps) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div className=&amp;quot;card&amp;quot;&amp;gt;&lt;br /&gt;
          {children}&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 export default function Profile() {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;Card&amp;gt;&lt;br /&gt;
          &amp;lt;Avatar /&amp;gt;&lt;br /&gt;
       &amp;lt;/Card&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;Card&amp;lt;/u&amp;gt; コンポーネントは、タグ内にどのような要素が渡されるかを知らなくてもよい。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;{children}&amp;lt;/u&amp;gt; の位置にネストされたコンテンツが展開される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== childrenの活用パターン ====&lt;br /&gt;
&amp;lt;code&amp;gt;children&amp;lt;/code&amp;gt; を活用することにより、汎用的なラッパーコンポーネントを作成できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
* Cardコンポーネントの例&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface CardProps {&lt;br /&gt;
    children: React.ReactNode;&lt;br /&gt;
    className?: string;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Card({ children, className }: CardProps) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div className={`card ${className}`}&amp;gt;&lt;br /&gt;
          {children}&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* 複数のセクションを持つLayoutコンポーネントの例&lt;br /&gt;
*: この場合、&amp;lt;u&amp;gt;sidebar&amp;lt;/u&amp;gt; と &amp;lt;u&amp;gt;content&amp;lt;/u&amp;gt; のように、Propとして複数のJSX要素を渡す方法も有効である。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface LayoutProps {&lt;br /&gt;
    sidebar: React.ReactNode;&lt;br /&gt;
    content: React.ReactNode;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Layout({ sidebar, content }: LayoutProps) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div className=&amp;quot;layout&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;aside&amp;gt;{sidebar}&amp;lt;/aside&amp;gt;&lt;br /&gt;
          &amp;lt;main&amp;gt;{content}&amp;lt;/main&amp;gt;&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Layout&lt;br /&gt;
    sidebar={&amp;lt;Navigation /&amp;gt;}&lt;br /&gt;
    content={&amp;lt;MainContent /&amp;gt;}&lt;br /&gt;
 /&amp;gt;&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*: &amp;lt;br&amp;gt;&lt;br /&gt;
* Modalコンポーネントの例&lt;br /&gt;
*: &amp;lt;code&amp;gt;isOpen&amp;lt;/code&amp;gt; がfalseの場合は、何もレンダリングしない設計にすることで、表示制御を親コンポーネント側で行える。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface ModalProps {&lt;br /&gt;
    isOpen: boolean;&lt;br /&gt;
    title: string;&lt;br /&gt;
    children: React.ReactNode;&lt;br /&gt;
    onClose: () =&amp;gt; void;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Modal({ isOpen, title, children, onClose }: ModalProps) {&lt;br /&gt;
    if (!isOpen) return null;&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;div className=&amp;quot;modal-overlay&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div className=&amp;quot;modal&amp;quot;&amp;gt;&lt;br /&gt;
             &amp;lt;h2&amp;gt;{title}&amp;lt;/h2&amp;gt;&lt;br /&gt;
             {children}&lt;br /&gt;
             &amp;lt;button onClick={onClose}&amp;gt;Close&amp;lt;/button&amp;gt;&lt;br /&gt;
          &amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;/div&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== スプレッド構文によるPropsの展開 ==&lt;br /&gt;
スプレッド構文を使用すると、Propsをまとめて子コンポーネントへ渡すことができる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
以下の2つの記述は同じ動作をする。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface ProfileProps {&lt;br /&gt;
    person: { name: string; imageId: string };&lt;br /&gt;
    size: number;&lt;br /&gt;
    isSepia: boolean;&lt;br /&gt;
    thickBorder: boolean;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // 冗長な書き方&lt;br /&gt;
 function Profile({ person, size, isSepia, thickBorder }: ProfileProps) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;Avatar&lt;br /&gt;
          person={person}&lt;br /&gt;
          size={size}&lt;br /&gt;
          isSepia={isSepia}&lt;br /&gt;
          thickBorder={thickBorder}&lt;br /&gt;
       /&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // スプレッド構文 (簡潔な記述)&lt;br /&gt;
 function Profile(props: ProfileProps) {&lt;br /&gt;
    return &amp;lt;Avatar {...props} /&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;スプレッド構文は簡潔である一方、どのPropsが渡されるかが不明確になる場合がある。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;そのため、使用は最小限にとどめ、Propsを個別に列挙する方が可読性は高い。&amp;lt;/u&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
全てのコンポーネントでスプレッド構文を使用することは避けること。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Props型定義 (TypeScript) ==&lt;br /&gt;
==== interfaceによるProps型の定義 ====&lt;br /&gt;
TypeScriptでは、&amp;lt;code&amp;gt;interface&amp;lt;/code&amp;gt; を使用してPropsの型を定義することができる。&amp;lt;br&amp;gt;&lt;br /&gt;
型定義により、コンパイル時に型の不一致を検出でき、IDEの補完機能も有効になる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface MyButtonProps {&lt;br /&gt;
    title: string;&lt;br /&gt;
    disabled: boolean;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function MyButton({ title, disabled }: MyButtonProps) {&lt;br /&gt;
    return &amp;lt;button disabled={disabled}&amp;gt;{title}&amp;lt;/button&amp;gt;;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== オプショナルPropsと必須Props ====&lt;br /&gt;
&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; を付加することでオプショナル (省略可能) なPropsを定義できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; のないPropsは必須となり、渡されない場合はコンパイルエラーになる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface CardProps {&lt;br /&gt;
    title: string;         // 必須&lt;br /&gt;
    description?: string;  // オプショナル&lt;br /&gt;
    onClick?: () =&amp;gt; void;  // オプショナルなコールバック&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== childrenの型定義 ====&lt;br /&gt;
&amp;lt;code&amp;gt;children&amp;lt;/code&amp;gt; Propの型には &amp;lt;code&amp;gt;React.ReactNode&amp;lt;/code&amp;gt; を使用することが推奨される。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface ModalRendererProps {&lt;br /&gt;
    title: string;&lt;br /&gt;
    children: React.ReactNode;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;children&amp;lt;/code&amp;gt; の型の選択肢を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ childrenの型定義&lt;br /&gt;
|-&lt;br /&gt;
! 型 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| React.ReactNode(推奨) || 文字列、数値、JSX 要素、null、undefined、配列等全ての値に対応する。&amp;lt;br&amp;gt;最も汎用的であり、通常はこちらを使用する。&lt;br /&gt;
|-&lt;br /&gt;
| React.ReactElement || JSX要素のみを受け付ける、より限定的な型&amp;lt;br&amp;gt;文字列や数値を受け付けないため、必要な場合にのみ使用する。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==== イベントハンドラの型 ====&lt;br /&gt;
Reactは各DOMイベントに対応する型を提供している。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface InputFieldProps {&lt;br /&gt;
    value: string;&lt;br /&gt;
    onChange: (event: React.ChangeEvent&amp;lt;HTMLInputElement&amp;gt;) =&amp;gt; void;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
代表的なイベントハンドラの型を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ 代表的なイベントハンドラの型&lt;br /&gt;
! 型 !! 対応するイベント&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.ChangeEvent&amp;amp;lt;HTMLInputElement&amp;amp;gt;&amp;lt;/code&amp;gt; || 入力フィールドの値変更&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.MouseEvent&amp;amp;lt;HTMLButtonElement&amp;amp;gt;&amp;lt;/code&amp;gt; || ボタンのクリック&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.FormEvent&amp;amp;lt;HTMLFormElement&amp;amp;gt;&amp;lt;/code&amp;gt; || フォームの送信&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.KeyboardEvent&amp;amp;lt;HTMLInputElement&amp;amp;gt;&amp;lt;/code&amp;gt; || キーボード入力&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;React.FocusEvent&amp;amp;lt;HTMLInputElement&amp;amp;gt;&amp;lt;/code&amp;gt; || フォーカスの変更&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Propsの設計原則 ==&lt;br /&gt;
==== 単方向データフロー ====&lt;br /&gt;
Reactでは、データは親コンポーネントから子コンポーネントへ一方向に流れる。&amp;lt;br&amp;gt;&lt;br /&gt;
子コンポーネントが親の状態を直接変更することはできない。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
子から親へデータを伝える場合は、コールバック関数をPropsとして渡す方法を使用する。&amp;lt;br&amp;gt;&lt;br /&gt;
以下の例では、&amp;lt;u&amp;gt;setFilterText&amp;lt;/u&amp;gt; 関数を &amp;lt;u&amp;gt;onFilterTextChange&amp;lt;/u&amp;gt; Propとして渡すことで、子コンポーネントが親の状態を更新できる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;typescript&amp;quot;&amp;gt;&lt;br /&gt;
 interface SearchBarProps {&lt;br /&gt;
    filterText: string;&lt;br /&gt;
    onFilterTextChange: (text: string) =&amp;gt; void;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function Parent() {&lt;br /&gt;
    const [filterText, setFilterText] = useState&amp;lt;string&amp;gt;(&amp;#039;&amp;#039;);&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;SearchBar&lt;br /&gt;
          filterText={filterText}&lt;br /&gt;
          onFilterTextChange={setFilterText}&lt;br /&gt;
       /&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 function SearchBar({ filterText, onFilterTextChange }: SearchBarProps) {&lt;br /&gt;
    return (&lt;br /&gt;
       &amp;lt;input&lt;br /&gt;
          value={filterText}&lt;br /&gt;
          onChange={(e) =&amp;gt; onFilterTextChange(e.target.value)}&lt;br /&gt;
       /&amp;gt;&lt;br /&gt;
    );&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
この設計パターンにより、状態の変更箇所が明確になり、データの流れを追いやすくなる。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Propsの設計における主な原則を以下に示す。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Props 設計のベストプラクティス&lt;br /&gt;
|-&lt;br /&gt;
! 項目 !! 説明&lt;br /&gt;
|-&lt;br /&gt;
| データは親から子へ一方向に渡す || 子コンポーネントは受け取ったPropsを直接変更しない。&lt;br /&gt;
|-&lt;br /&gt;
| 子から親への通信はコールバック関数で行う || &amp;lt;code&amp;gt;onChange&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;onClose&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;onSubmit&amp;lt;/code&amp;gt; 等の命名規則を使用する。&lt;br /&gt;
|-&lt;br /&gt;
| Propsは最小限にする || 不要なPropsを渡さないことで、コンポーネントの責務を明確にする。&lt;br /&gt;
|-&lt;br /&gt;
| TypeScriptで型を定義する || 型定義により、意図しない使用を防ぎ、ソースコードの可読性を高める。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 関連情報 ==&lt;br /&gt;
* [[Reactの基礎 - TSXの基本構文]]&lt;br /&gt;
* [[Reactの基礎 - JSXの基本構文]]&lt;br /&gt;
* [[Reactの基礎 - 条件レンダリング]]&lt;br /&gt;
* [[Reactの基礎 - リストレンダリング]]&lt;br /&gt;
* [[Reactの基礎 - コンポーネント]]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki&lt;br /&gt;
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板,React,JavaScript,TypeScript,TSX,JSX,Props,children,ReactNode,コンポーネント,単方向データフロー,分割代入,フロントエンド&lt;br /&gt;
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux&lt;br /&gt;
|image=/resources/assets/MochiuLogo_Single_Blue.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
__FORCETOC__&lt;br /&gt;
[[カテゴリ:Rust]][[カテゴリ:Web]]&lt;/div&gt;</summary>
		<author><name>Wiki</name></author>
	</entry>
</feed>