propsが渡ってこないときの原因と対策
propsが undefined
になる主な理由とそのチェックポイント
❓ よくある症状
props
がundefined
になる- コンソールに
TypeError: Cannot read property 'xxx' of undefined
- コンポーネント内で受け取ったはずの値が空
✅ チェックすべきポイント一覧
原因 | 説明 | 対策例 |
---|---|---|
親から渡していない | JSXにpropsを指定し忘れている | <Child name="Takuma" /> を確認 |
props名のスペルミス | 小文字・大文字の違い、キャメルケース崩れなど | name と Name は別物 |
構造分割でミスしている | props 全体ではなく props.name を使っているのにname がない |
({ name }) か props.name のどちらかに統一 |
テスト時のpropsの渡し忘れ | JestやRTLでコンポーネントをテストする際にprops未指定 | テストコードで props を明示的に渡す |
デフォルト値が必要な型定義ミス(TypeScript) | optionalでないのに未指定になっている | name?: string か、defaultProps で補完 |
子コンポーネントの受け取りコードの書き間違い | function Component(props) を function Component() にしてしまっている |
正しく props を受け取っているか確認 |
📌 例:propsが渡らないケースと対策
❌ NG: 親から渡していない
// 親コンポーネント
<Child />
// 子コンポーネント
const Child = ({ name }) => {
return
<p>Hello, {name}</p>
}
結果 → Hello, undefined
✅ 修正:
<Child name="拓磨" />
❌ NG: propsの構造分割に失敗している
const Child = (props) => {
const { Name } = props // ← 大文字スペルミス
return
<p>{Name}</p>
}
✅ 修正:
const Child = ({ name }) => {
return
<p>{name}</p>
}
❌ NG: テスト時にprops未設定
render(<GreetingForm />) // ← nameを渡していない
✅ 修正:
render(<GreetingForm name="Test" />)
🛠 TypeScriptの注意点
type Props = {
name: string // 必須
}
const Component = ({ name }: Props) => {
return
<p>{name}</p>
}
✅ 対策①:propsを optional にする
type Props = {
name?: string
}
✅ 対策②:defaultProps で補完(関数コンポーネントでは useMemo 等を使って手動で補完)
✅ まとめ
状況 | チェックポイント |
---|---|
値が来ていない | 親が props を渡しているか |
受け取りに失敗している | 構造分割・スペルミスを確認 |
テストでうまく動かない | render() の props を忘れていないか |
TypeScriptで型エラー | optional化 or デフォルト補完の検討 |
🔗 参考