React 入門:コンポーネント間のデータ共有の基本
React ではコンポーネントを小さく分けて再利用する設計が基本です。しかし、複数のコンポーネントが同じデータにアクセスしたい場合、コンポーネント間でデータをどう共有するかが課題になります。
今回は、基本的なデータ共有の方法と考え方を整理して紹介します。
1. 親から子へのデータ共有(Props)
最も基本的な方法は Props を使うこと です。親コンポーネントが持つデータを子コンポーネントに渡す形です。
function Child({ name }) {
return <p>こんにちは、{name}さん!</p>;
}
function Parent() {
const userName = "太郎";
return <Child name={userName} />;
}
Parent
がデータを持ち、Child
に渡して表示- 一方向のデータフロー(親 → 子)
2. 子から親へのデータ共有(関数を Props として渡す)
子コンポーネントから親にデータを伝えたい場合、親側で関数を定義し、それを Props として子に渡します。
function Child({ onClick }) {
return <button onClick={() => onClick("クリックされました")}>送信</button>;
}
function Parent() {
const handleChildClick = (message) => {
console.log("子からのメッセージ:", message);
};
return <Child onClick={handleChildClick} />;
}
- 子がボタンを押すと、親の関数が呼ばれてデータを受け取れる
- これも基本的には 一方向のフロー
3. 状態を上位コンポーネントに持たせる(リフトアップ)
複数の子コンポーネントで同じデータを共有したい場合、State を共通の親に持たせる方法があります。これを「リフトアップ(Lifting State Up)」と呼びます。
例:複数の入力フォームで同じ値を管理
import { useState } from "react";
function Input({ value, onChange }) {
return <input value={value} onChange={(e) => onChange(e.target.value)} />;
}
function Display({ value }) {
return <p>入力内容: {value}</p>;
}
function App() {
const [text, setText] = useState("");
return (
<div>
<Input value={text} onChange={setText} />
<Display value={text} />
</div>
);
}
text
は親コンポーネントApp
が管理Input
で変更 →Display
に反映- これで複数の子コンポーネント間で同じ状態を共有できる
4. コンテキストを使ったデータ共有(Context API)
親子関係が深くなると、Props を何階層も渡す必要があり面倒です。この場合 Context API を使うと便利です。
import { createContext, useContext, useState } from "react";
const UserContext = createContext();
function Display() {
const user = useContext(UserContext);
return <p>ユーザー: {user}</p>;
}
function App() {
const [user] = useState("太郎");
return (
<UserContext.Provider value={user}>
<Display />
</UserContext.Provider>
);
}
UserContext.Provider
に値をセットすると、その子孫コンポーネントならどこでもuseContext
で取得可能- Props を何階層も渡す必要がない
5. 外部ライブラリを使った状態管理(Redux, Zustand など)
さらに大規模なアプリでは、グローバルに状態を管理するライブラリ を使うことが多いです。
- Redux, Zustand, Recoil など
- 複数のコンポーネントから同じ状態を直接読み書きできる
- Context よりも高度な状態管理が可能
まとめ
- 親から子へのデータ共有は Props
- 子から親へは 関数を Props として渡す
- 複数の子間で共有したいときは リフトアップ
- 親子関係が深い場合は Context API
- 大規模アプリでは 外部状態管理ライブラリ を検討