Untitled
【もう迷わない!】React公式ドキュメントの読み方完全ガイド
「React公式ドキュメント、 どこから読めばいいの?」
「専門用語ばかりで 何を言ってるかわからない...」
「サンプルコード見ても うまく動かない」
そんな悩みを抱えていませんか?
React公式ドキュメントって、 確かに最初は難しく感じますよね。 でも実は、正しい読み方を知れば グッと理解しやすくなるんです!
今回は、React初心者でも 公式ドキュメントをスムーズに 読み進められる方法を 一緒に学んでいきましょう。
React公式ドキュメントの構造を理解しよう
まず最初に、React公式ドキュメントが どんな構造になっているか 見てみましょう。
全体の構成
React公式ドキュメント(https://react.dev/)は こんな風に分かれています:
React公式ドキュメント
├── Learn React(学習セクション)
│ ├── Installation
│ ├── Describing the UI
│ ├── Adding Interactivity
│ ├── Managing State
│ ├── Escape Hatches
│ └── Thinking in React
│
├── API Reference(リファレンス)
│ ├── React APIs
│ ├── React DOM APIs
│ └── Rules of Hooks
│
└── Community(コミュニティ)
├── Team
├── Acknowledgements
└── Versions
各セクションの難易度
それぞれのセクションには 難易度があります。 信号機みたいに 色分けしてみますね:
🟢 初心者でも安心
🟡 ちょっと頑張ろう
🔴 上級者向け
Learn Reactセクション:
- 🟢 Installation(環境構築)
- 🟢 Describing the UI(画面作り)
- 🟡 Adding Interactivity(クリック処理など)
- 🔴 Managing State(データ管理)
- 🔴 Escape Hatches(高度な機能)
- 🟡 Thinking in React(考え方)
API Referenceセクション:
- 🔴 React APIs(辞書的な内容)
- 🔴 React DOM APIs(DOM操作)
- 🟡 Rules of Hooks(ルール説明)
2023年の新ドキュメントの特徴
2023年に公開された新しい 公式ドキュメントには こんな特徴があります:
初心者に優しくなったポイント:
- 関数コンポーネント中心の説明
- Hooksを最初から学べる構成
- 実際に使えるサンプルコード
- 手を動かしながら学べる仕組み
- ステップバイステップの学習
昔のドキュメントと比べて 格段に学びやすくなりました!
【完全攻略】初心者向け読み進め方
「どこから読めばいいの?」
そんなあなたに、 おすすめの読み進め方を ご紹介します!
ステップ1:まずは環境を作ろう
最初は「Installation」から 始めましょう。
# 推奨される方法でReactアプリを作る
npx create-react-app my-app
cd my-app
npm start
このコマンドを実行すると、 ブラウザに「Hello World」的な 画面が表示されます。
読み方のコツ:
- まずは推奨方法(Create React App)だけ試す
- ViteやNext.jsの説明は後回しでOK
- 実際に手を動かして環境を作る
- ブラウザで画面が表示されることを確認
「よくわからないけど、 とりあえず動いた!」
それで十分です!
ステップ2:「Describing the UI」を集中攻略
このセクションが最重要です。 ここをマスターすれば、 Reactの基本は完璧!
// 公式ドキュメントの基本サンプル
function MyButton() {
return (
<button>私はボタンです</button>
);
}
export default function MyApp() {
return (
<div>
<h1>私のアプリへようこそ</h1>
<MyButton />
</div>
);
}
このコードを実際に試してみましょう。
App.js
ファイルの中身を
上のコードに置き換えて保存すると、
画面が自動で更新されます!
読む順番はこちら:
- ✅ Your First Component(コンポーネントって何?)
- ✅ Importing and Exporting Components(ファイル分け)
- ✅ Writing Markup with JSX(HTMLっぽい書き方)
- ✅ JavaScript in JSX with Curly Braces({}の使い方)
- ⭐ Passing Props to a Component(データ渡し)
- ⭐ Conditional Rendering(条件で表示切り替え)
- ⭐ Rendering Lists(リスト表示)
- 🔺 Keeping Components Pure(後回しOK)
⭐がついているものは 特に重要です!
ステップ3:実際のコードで練習しよう
ドキュメントを読むだけじゃなく、 実際にコードを書いて 確認しましょう。
// 1. シンプルなあいさつコンポーネント
function Greeting() {
return <h1>こんにちは、世界!</h1>;
}
// 2. 名前を表示するコンポーネント
function UserGreeting({ name }) {
return <h1>こんにちは、{name}さん!</h1>;
}
// 3. 条件で表示を変えるコンポーネント
function WelcomeMessage({ isLoggedIn, userName }) {
if (isLoggedIn) {
return <h1>おかえりなさい、{userName}さん!</h1>;
}
return <h1>ログインしてください</h1>;
}
// 4. リストを表示するコンポーネント
function ShoppingList({ items }) {
return (
<ul>
{items.map(item => (
<li key={item.id}>
{item.name} - {item.price}円
</li>
))}
</ul>
);
}
これらのコードをApp.js
で
実際に使ってみてください。
例えば:
export default function App() {
const shoppingItems = [
{ id: 1, name: 'りんご', price: 100 },
{ id: 2, name: 'バナナ', price: 80 },
{ id: 3, name: 'オレンジ', price: 120 }
];
return (
<div>
<Greeting />
<UserGreeting name="田中" />
<WelcomeMessage isLoggedIn={true} userName="佐藤" />
<ShoppingList items={shoppingItems} />
</div>
);
}
ステップ4:「Adding Interactivity」で動きをつけよう
基本的な表示ができたら、 今度はボタンのクリックなど 動きのある機能を学びます。
// 基本的なボタンクリック
function ClickButton() {
function handleClick() {
alert('ボタンがクリックされました!');
}
return (
<button onClick={handleClick}>
クリックしてください
</button>
);
}
このコードも実際に試してみましょう。 ボタンを押すと、 ポップアップが表示されるはずです!
このセクションで学ぶ順番:
- ✅ Responding to Events(ボタンクリック等)
- ✅ State: A Component's Memory(データの記憶)
- ✅ Render and Commit(画面更新の仕組み)
- ⭐ State as a Snapshot(stateの理解)
- ⭐ Queueing a Series of State Updates(更新の順番)
- 🔺 オブジェクト・配列の更新(後回しOK)
「state」って単語がよく出てきますが、 「コンポーネントが覚えているデータ」 と思えばOKです!
【攻略法】難しい部分を乗り越えよう
「Hooksって何?」 「useEffectがわからない...」
そんな難しい部分の 攻略法をお教えします!
Hooksの理解方法
Hooksは初心者にとって 最も理解しにくい概念です。 でも大丈夫! 段階的に理解していきましょう。
// まずはuseStateだけ理解しよう
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
console.log('現在のcount:', count); // デバッグ用
return (
<div>
<p>カウント: {count}</p>
<button onClick={() => setCount(count + 1)}>
増やす
</button>
</div>
);
}
理解のステップ:
- まずは
useState
だけに集中 console.log
でstateの変化を確認- 公式のサンプルを完全コピーして動作確認
- 少しずつ変更を加えて挙動を確認
useEffect
は後回し(混乱を避けるため)
「一度に全部理解しようとしない」 これが大切です!
useEffectの段階的理解
useEffect
は特に難しい概念。
でも、順番に理解すれば
必ずできるようになります!
// ステップ1: 副作用なしのuseEffect
import { useState, useEffect } from 'react';
function SimpleEffect() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('useEffectが実行されました');
});
return (
<div>
<p>カウント: {count}</p>
<button onClick={() => setCount(count + 1)}>
増やす
</button>
</div>
);
}
まずはこのコードを試して、 コンソールを見てみてください。 ボタンを押すたびに メッセージが表示されるはずです。
// ステップ2: 依存配列を使ってみる
function EffectWithDependency() {
const [count, setCount] = useState(0);
const [name, setName] = useState('');
useEffect(() => {
console.log('countが変更されました:', count);
}, [count]); // countが変更された時のみ実行
return (
<div>
<p>カウント: {count}</p>
<button onClick={() => setCount(count + 1)}>
増やす
</button>
<input
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="名前を入力"
/>
</div>
);
}
このコードでは、名前を入力しても
useEffect
は実行されません。
count
が変わった時だけ実行されます!
useEffect理解のポイント:
- 依存配列なしから始める
console.log
で実行タイミングを確認- 依存配列ありのパターンを試す
- クリーンアップ関数は最後に学習
- 「Rules of Hooks」は後で読む
状態管理の段階的アプローチ
「Managing State」セクションは かなり上級者向けです。 簡単な例から始めましょう。
// 複雑な公式の例を簡略化
// 公式: 複雑なTaskアプリの例
// ↓
// 簡略版: シンプルなTodoアプリ
function SimpleTodoApp() {
const [todos, setTodos] = useState([]);
const [newTodo, setNewTodo] = useState('');
const addTodo = () => {
if (newTodo.trim()) {
setTodos([...todos, {
id: Date.now(),
text: newTodo
}]);
setNewTodo('');
}
};
return (
<div>
<input
value={newTodo}
onChange={(e) => setNewTodo(e.target.value)}
placeholder="新しいTodo"
/>
<button onClick={addTodo}>追加</button>
<ul>
{todos.map(todo => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
</div>
);
}
公式の例が複雑すぎる時は、 このように簡略化して 理解しましょう!
専門用語の理解方法
公式ドキュメントには たくさんの専門用語が出てきます。 自分だけの用語集を作りながら 読み進めましょう!
/*
【私のReact用語集】
Component(コンポーネント)
→ UIの部品。レゴブロックみたいなもの
Props(プロパティ)
→ 親から子へのデータ受け渡し。手紙みたいなもの
State(状態)
→ コンポーネントが覚えているデータ。メモリみたいなもの
Hook(フック)
→ 関数コンポーネントで特殊な機能を使うための道具
JSX
→ JavaScriptの中でHTMLのような書き方ができる魔法
Render(レンダリング)
→ コンポーネントを画面に表示する処理
Side Effect(副作用)
→ 画面表示以外の処理(データ取得、タイマーなど)
*/
セクション別攻略ガイド
各セクションの特徴と 効果的な読み方を 詳しく説明しますね!
「Describing the UI」セクション完全攻略
このセクションは最重要です。 ここをマスターすれば、 Reactの8割は理解できます!
// このセクションで習得すべき内容
// 1. コンポーネントの基本
function Welcome() {
return <h1>Reactへようこそ!</h1>;
}
// 2. JSXでJavaScript使用
function UserInfo() {
const user = {
name: '田中太郎',
age: 30
};
return (
<div>
<h2>{user.name}さんの情報</h2>
<p>年齢: {user.age}歳</p>
</div>
);
}
// 3. Propsでデータ受け渡し
function Greeting({ name, time }) {
return (
<div>
<h1>おはよう、{name}さん!</h1>
<p>現在時刻: {time}</p>
</div>
);
}
// 4. 条件分岐で表示切り替え
function LoginStatus({ isLoggedIn }) {
return (
<div>
{isLoggedIn ? (
<p>ログイン済みです</p>
) : (
<p>ログインしてください</p>
)}
</div>
);
}
// 5. リスト表示
function FruitList({ fruits }) {
return (
<ul>
{fruits.map(fruit => (
<li key={fruit.id}>
{fruit.name} - {fruit.price}円
</li>
))}
</ul>
);
}
効果的な学習方法:
- 各サンプルコードを完全にコピー
- 実際に動かして確認
- 少しずつ変更を加えて実験
- エラーが出たら公式で確認
- 理解できたら次の項目へ
「Adding Interactivity」セクション攻略
イベント処理とstateを 段階的に学びましょう。
// ステップ1: 基本的なイベント処理
function ClickButton() {
const handleClick = () => {
console.log('ボタンがクリックされました');
};
return (
<button onClick={handleClick}>
クリック
</button>
);
}
// ステップ2: 引数付きイベント処理
function ButtonWithMessage() {
const handleClick = (message) => {
alert(message);
};
return (
<div>
<button onClick={() => handleClick('ボタン1です')}>
ボタン1
</button>
<button onClick={() => handleClick('ボタン2です')}>
ボタン2
</button>
</div>
);
}
// ステップ3: stateとイベントの組み合わせ
function CounterWithButtons() {
const [count, setCount] = useState(0);
const increment = () => {
setCount(count + 1);
};
const decrement = () => {
setCount(count - 1);
};
const reset = () => {
setCount(0);
};
return (
<div>
<p>カウント: {count}</p>
<button onClick={increment}>+1</button>
<button onClick={decrement}>-1</button>
<button onClick={reset}>リセット</button>
</div>
);
}
読み方のコツ:
- まずはクリックイベントから
console.log
で動作確認- stateの変化を目で見て確認
- 複雑な例は後回し
「Managing State」セクション攻略
最も難しいセクションですが、 段階的に理解すれば大丈夫!
// ステップ1: 単純なオブジェクト状態
function UserProfile() {
const [user, setUser] = useState({
name: '',
email: ''
});
const updateName = (newName) => {
setUser(prev => ({
...prev,
name: newName
}));
};
const updateEmail = (newEmail) => {
setUser(prev => ({
...prev,
email: newEmail
}));
};
return (
<div>
<input
value={user.name}
onChange={(e) => updateName(e.target.value)}
placeholder="名前"
/>
<input
value={user.email}
onChange={(e) => updateEmail(e.target.value)}
placeholder="メールアドレス"
/>
<p>名前: {user.name}</p>
<p>メール: {user.email}</p>
</div>
);
}
// ステップ2: 配列状態の管理
function TodoList() {
const [todos, setTodos] = useState([]);
const [newTodo, setNewTodo] = useState('');
const addTodo = () => {
if (newTodo.trim()) {
setTodos(prev => [
...prev,
{ id: Date.now(), text: newTodo, completed: false }
]);
setNewTodo('');
}
};
const toggleTodo = (id) => {
setTodos(prev => prev.map(todo =>
todo.id === id
? { ...todo, completed: !todo.completed }
: todo
));
};
const deleteTodo = (id) => {
setTodos(prev => prev.filter(todo => todo.id !== id));
};
return (
<div>
<input
value={newTodo}
onChange={(e) => setNewTodo(e.target.value)}
placeholder="新しいTodo"
/>
<button onClick={addTodo}>追加</button>
<ul>
{todos.map(todo => (
<li key={todo.id}>
<input
type="checkbox"
checked={todo.completed}
onChange={() => toggleTodo(todo.id)}
/>
<span style={{
textDecoration: todo.completed ? 'line-through' : 'none'
}}>
{todo.text}
</span>
<button onClick={() => deleteTodo(todo.id)}>
削除
</button>
</li>
))}
</ul>
</div>
);
}
攻略のポイント:
- 単純なstring/number状態から始める
- オブジェクト状態の更新方法を理解
- 配列状態の操作を段階的に学習
- 公式の複雑な例は後回し
- 実際のアプリケーションで練習
API Referenceの効果的な使い方
API Referenceは 「辞書」として使いましょう。 最初から全部読む必要はありません!
辞書的な使用方法
// 例: useStateの詳細を調べたい時だけ参照
// 初期値として関数を渡したい場合
const [expensiveValue, setExpensiveValue] = useState(() => {
console.log('重い計算を実行中...');
return calculateExpensiveValue();
});
// 関数形式でstate更新したい場合
const handleUpdate = () => {
setExpensiveValue(prev => {
console.log('前の値:', prev);
return prev + 1;
});
};
function calculateExpensiveValue() {
// 時間のかかる処理のシミュレーション
let result = 0;
for (let i = 0; i < 1000000; i++) {
result += i;
}
return result;
}
効果的な活用のコツ
使うタイミング:
- 学習初期は読まない(混乱を避けるため)
- 具体的な問題が発生した時に参照
- サンプルコードを実際に動かして確認
- よく使うAPIから徐々に詳細を理解
- 全てを覚える必要はない(必要な時に調べる)
「困った時の辞書」 として活用しましょう!
実践的な学習方法
公式ドキュメントを効果的に 活用するための方法を ご紹介します!
プロジェクト学習法
段階的にプロジェクトを作って、 理解を深めましょう。
// プロジェクト1: 基本カウンターアプリ
function CounterApp() {
const [count, setCount] = useState(0);
return (
<div>
<h1>カウンターアプリ</h1>
<p>現在の値: {count}</p>
<button onClick={() => setCount(count + 1)}>
+1
</button>
<button onClick={() => setCount(count - 1)}>
-1
</button>
<button onClick={() => setCount(0)}>
リセット
</button>
</div>
);
}
// プロジェクト2: シンプルTodoアプリ
function TodoApp() {
const [todos, setTodos] = useState([]);
const [inputValue, setInputValue] = useState('');
const addTodo = () => {
if (inputValue.trim()) {
setTodos([...todos, {
id: Date.now(),
text: inputValue,
completed: false
}]);
setInputValue('');
}
};
const toggleTodo = (id) => {
setTodos(todos.map(todo =>
todo.id === id
? { ...todo, completed: !todo.completed }
: todo
));
};
return (
<div>
<h1>Todoアプリ</h1>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="新しいTodoを入力"
/>
<button onClick={addTodo}>追加</button>
<ul>
{todos.map(todo => (
<li key={todo.id}>
<input
type="checkbox"
checked={todo.completed}
onChange={() => toggleTodo(todo.id)}
/>
{todo.text}
</li>
))}
</ul>
</div>
);
}
// プロジェクト3: データ取得アプリ
function WeatherApp() {
const [weather, setWeather] = useState(null);
const [loading, setLoading] = useState(false);
const [city, setCity] = useState('');
useEffect(() => {
if (city) {
setLoading(true);
// 実際のAPIの代わりにモックデータ
setTimeout(() => {
setWeather({
city: city,
temperature: Math.floor(Math.random() * 30) + 10,
description: '晴れ'
});
setLoading(false);
}, 1000);
}
}, [city]);
return (
<div>
<h1>天気アプリ</h1>
<input
value={city}
onChange={(e) => setCity(e.target.value)}
placeholder="都市名を入力"
/>
{loading && <p>読み込み中...</p>}
{weather && (
<div>
<h2>{weather.city}の天気</h2>
<p>気温: {weather.temperature}°C</p>
<p>天気: {weather.description}</p>
</div>
)}
</div>
);
}
エラー解決学習法
意図的にエラーを作って、 理解を深めましょう。
// よくあるエラー1: key属性なし
function BadListExample() {
const items = ['りんご', 'バナナ', 'オレンジ'];
return (
<ul>
{items.map(item => (
// Warning: Each child should have unique "key"
<li>{item}</li>
))}
</ul>
);
}
// 修正版
function GoodListExample() {
const items = ['りんご', 'バナナ', 'オレンジ'];
return (
<ul>
{items.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
);
}
// よくあるエラー2: stateの直接変更
function BadStateExample() {
const [items, setItems] = useState(['item1', 'item2']);
const addItem = () => {
// ❌ 直接配列を変更(Reactは変更を検知できない)
items.push('new item');
setItems(items);
};
return (
<div>
<ul>
{items.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
<button onClick={addItem}>アイテム追加</button>
</div>
);
}
// 修正版
function GoodStateExample() {
const [items, setItems] = useState(['item1', 'item2']);
const addItem = () => {
// ✅ 新しい配列を作成
setItems([...items, 'new item']);
};
return (
<div>
<ul>
{items.map((item, index) => (
<li key={index}>{item}</li>
))}
</ul>
<button onClick={addItem}>アイテム追加</button>
</div>
);
}
エラーを経験することで、 「なぜこう書くのか」が よくわかるようになります!
よくある読み方の間違い
公式ドキュメントを読む時の よくある間違いと対策を ご紹介します。
間違い1:完璧主義の罠
// ❌ やりがちな間違い
/*
- 「Escape Hatches」を最初から理解しようとする
- 全てのHooksを一度に覚えようとする
- APIリファレンスを暗記しようとする
*/
// ✅ 正しいアプローチ:80%理解で進む
function LearningProgress() {
const [level, setLevel] = useState('beginner');
// 理解度80%で次のレベルに進む
const progressToNext = () => {
if (level === 'beginner') {
setLevel('intermediate');
} else if (level === 'intermediate') {
setLevel('advanced');
}
};
return (
<div>
<p>現在のレベル: {level}</p>
<button onClick={progressToNext}>
次のレベルに進む(80%理解できたら)
</button>
</div>
);
}
「完璧に理解してから次に」 ではなく、 「だいたいわかったら次に」 で進みましょう!
間違い2:コピー&ペーストで満足
// ❌ 良くない学習方法
/*
1. 公式のサンプルをそのままコピー
2. 動作確認せずに次に進む
3. 変更を加えて実験しない
*/
// ✅ 正しいアプローチ:段階的な理解
// 公式のサンプル
function OriginalExample() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
Count: {count}
</button>
);
}
// ステップ1: 完全コピーで動作確認
function Step1Copy() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
Count: {count}
</button>
);
}
// ステップ2: 少し変更してみる
function Step2Modify() {
const [count, setCount] = useState(0);
console.log('現在のcount:', count); // デバッグ用
return (
<div>
<p>カウンター: {count}</p>
<button onClick={() => setCount(count + 1)}>
増加
</button>
<button onClick={() => setCount(count - 1)}>
減少
</button>
</div>
);
}
// ステップ3: さらに機能追加
function Step3Enhance() {
const [count, setCount] = useState(0);
const [step, setStep] = useState(1);
const increment = () => setCount(count + step);
const decrement = () => setCount(count - step);
const reset = () => setCount(0);
return (
<div>
<p>カウンター: {count}</p>
<p>ステップ: {step}</p>
<input
type="number"
value={step}
onChange={(e) => setStep(Number(e.target.value))}
/>
<br />
<button onClick={increment}>+{step}</button>
<button onClick={decrement}>-{step}</button>
<button onClick={reset}>リセット</button>
</div>
);
}
間違い3:理論だけで実践しない
// ❌ 非効率な学習方法
/*
- ドキュメントを読むだけ
- 実際のコードを書かない
- エラーを経験しない
*/
// ✅ 正しいアプローチ:実践中心の学習
// 学習課題例:ユーザー管理アプリ
function UserManagementApp() {
const [users, setUsers] = useState([]);
const [newUser, setNewUser] = useState({ name: '', email: '' });
const [editingId, setEditingId] = useState(null);
// ユーザー追加
const addUser = () => {
if (newUser.name && newUser.email) {
setUsers([...users, {
id: Date.now(),
name: newUser.name,
email: newUser.email
}]);
setNewUser({ name: '', email: '' });
}
};
// ユーザー削除
const deleteUser = (id) => {
setUsers(users.filter(user => user.id !== id));
};
// 編集開始
const startEdit = (user) => {
setEditingId(user.id);
setNewUser({ name: user.name, email: user.email });
};
// 編集完了
const finishEdit = () => {
setUsers(users.map(user =>
user.id === editingId
? { ...user, name: newUser.name, email: newUser.email }
: user
));
setEditingId(null);
setNewUser({ name: '', email: '' });
};
return (
<div>
<h1>ユーザー管理</h1>
{/* 入力フォーム */}
<div>
<input
value={newUser.name}
onChange={(e) => setNewUser({
...newUser,
name: e.target.value
})}
placeholder="名前"
/>
<input
value={newUser.email}
onChange={(e) => setNewUser({
...newUser,
email: e.target.value
})}
placeholder="メールアドレス"
/>
{editingId ? (
<button onClick={finishEdit}>更新</button>
) : (
<button onClick={addUser}>追加</button>
)}
</div>
{/* ユーザー一覧 */}
<ul>
{users.map(user => (
<li key={user.id}>
{user.name} - {user.email}
<button onClick={() => startEdit(user)}>
編集
</button>
<button onClick={() => deleteUser(user.id)}>
削除
</button>
</li>
))}
</ul>
</div>
);
}
学習進度チェックリスト
自分の理解度を確認するための チェックリストです。
基礎レベル(Describing the UI)
理解度チェック:
// ✅ 基礎レベルの確認項目
// 1. コンポーネントを作成できる
function MyComponent() {
return <div>Hello World</div>;
}
// 2. JSXでJavaScript式を使える
function GreetingComponent() {
const name = "田中さん";
const time = new Date().toLocaleTimeString();
return (
<div>
<h1>こんにちは、{name}!</h1>
<p>現在時刻: {time}</p>
</div>
);
}
// 3. propsを受け取って使える
function WelcomeMessage({ userName, isVIP }) {
return (
<div>
<h2>ようこそ、{userName}さん</h2>
{isVIP && <span>⭐ VIP会員</span>}
</div>
);
}
// 4. 条件分岐ができる
function LoginStatus({ isLoggedIn, user }) {
if (isLoggedIn) {
return <p>ログイン中: {user.name}</p>;
}
return <p>ログインしてください</p>;
}
// 5. リストをレンダリングできる
function ShoppingList({ items }) {
return (
<ul>
{items.map(item => (
<li key={item.id}>
{item.name} - {item.price}円
</li>
))}
</ul>
);
}
達成の目安:
- □ コンポーネントを自力で作成できる
- □ JSXの中でJavaScriptを使える
- □ propsの受け渡しができる
- □ 条件分岐を適切に書ける
- □ 配列のmap関数でリストが作れる
- □ key属性の必要性を理解している
中級レベル(Adding Interactivity)
// ✅ 中級レベルの確認項目
// 1. イベントハンドリングができる
function InteractiveButton() {
const handleClick = (message) => {
alert(message);
};
return (
<div>
<button onClick={() => handleClick('ボタン1クリック')}>
ボタン1
</button>
<button onClick={() => handleClick('ボタン2クリック')}>
ボタン2
</button>
</div>
);
}
// 2. useStateを使ってstateを管理できる
function CounterComponent() {
const [count, setCount] = useState(0);
const [step, setStep] = useState(1);
return (
<div>
<p>カウント: {count}</p>
<p>ステップ: {step}</p>
<button onClick={() => setCount(count + step)}>
+{step}
</button>
<button onClick={() => setCount(count - step)}>
-{step}
</button>
<input
type="number"
value={step}
onChange={(e) => setStep(Number(e.target.value))}
/>
</div>
);
}
// 3. フォームの状態管理ができる
function ContactForm() {
const [formData, setFormData] = useState({
name: '',
email: '',
message: ''
});
const handleChange = (field, value) => {
setFormData(prev => ({
...prev,
[field]: value
}));
};
const handleSubmit = (e) => {
e.preventDefault();
console.log('送信データ:', formData);
};
return (
<form onSubmit={handleSubmit}>
<input
value={formData.name}
onChange={(e) => handleChange('name', e.target.value)}
placeholder="名前"
/>
<input
value={formData.email}
onChange={(e) => handleChange('email', e.target.value)}
placeholder="メールアドレス"
/>
<textarea
value={formData.message}
onChange={(e) => handleChange('message', e.target.value)}
placeholder="メッセージ"
/>
<button type="submit">送信</button>
</form>
);
}
達成の目安:
- □ イベントハンドラーを適切に設定できる
- □ useStateでstateを管理できる
- □ オブジェクトstateの更新ができる
- □ 配列stateの操作ができる
- □ フォームの双方向データバインディングができる
- □ イベントオブジェクトを適切に扱える
上級レベル(Managing State + Escape Hatches)
// ✅ 上級レベルの確認項目
// 1. useEffectでサイドエフェクトを管理できる
function DataFetcher({ userId }) {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
let isCancelled = false;
const fetchUser = async () => {
try {
setLoading(true);
setError(null);
// APIコール(モック)
await new Promise(resolve => setTimeout(resolve, 1000));
const userData = {
id: userId,
name: `ユーザー${userId}`
};
if (!isCancelled) {
setUser(userData);
}
} catch (err) {
if (!isCancelled) {
setError(err.message);
}
} finally {
if (!isCancelled) {
setLoading(false);
}
}
};
fetchUser();
return () => {
isCancelled = true;
};
}, [userId]);
if (loading) return <div>読み込み中...</div>;
if (error) return <div>エラー: {error}</div>;
if (!user) return <div>ユーザーが見つかりません</div>;
return (
<div>
<h2>{user.name}</h2>
<p>ID: {user.id}</p>
</div>
);
}
// 2. カスタムフックを作成できる
function useCounter(initialValue = 0, step = 1) {
const [count, setCount] = useState(initialValue);
const increment = useCallback(() => {
setCount(prev => prev + step);
}, [step]);
const decrement = useCallback(() => {
setCount(prev => prev - step);
}, [step]);
const reset = useCallback(() => {
setCount(initialValue);
}, [initialValue]);
return { count, increment, decrement, reset };
}
達成の目安:
- □ useEffectで副作用を適切に管理できる
- □ useEffectのクリーンアップができる
- □ 依存配列を正しく設定できる
- □ カスタムフックを作成できる
- □ useCallback、useMemoで最適化できる
- □ Context APIで状態共有ができる
- □ useRefでDOMアクセスができる
まとめ:公式ドキュメントを味方につけよう
お疲れさまでした! React公式ドキュメントの 効果的な読み方について 詳しくご紹介しました。
重要なポイントをおさらい
学習の進め方:
- 段階的学習:基礎→応用へ、理解度80%で次へ
- 実践重視:読むだけでなく、必ず手を動かす
- 適切な順序:Installation → UI → Interactivity → State
- 辞書活用:API Referenceは必要な時に参照
気をつけるポイント:
- 完璧主義に陥らず、段階的に理解する
- コピペだけでなく、変更を加えて実験する
- 古い情報に惑わされず、最新版を参照する
- 理論と実践のバランスを大切にする
次のステップ
公式ドキュメントに慣れたら、 こんなことにチャレンジしてみましょう:
実践的なプロジェクト:
- 📝 日記アプリを作ってみる
- 🛒 ショッピングカートアプリ
- 🌤️ 天気予報アプリ
- 📱 SNSっぽいアプリ
- 🎮 簡単なゲームアプリ
さらなる学習:
- React Router(画面遷移)
- API連携(データ取得)
- スタイリング(CSS-in-JS)
- テスト(Jest, Testing Library)
- デプロイ(Vercel, Netlify)
最後に
React公式ドキュメントは 確かに最初は難しく感じるかもしれません。 でも、正しい読み方を身につければ あなたの強い味方になってくれます!
大切なのは:
- 焦らずに段階的に進むこと
- 手を動かして実際に体験すること
- わからないことがあっても諦めないこと
- 楽しみながら学習すること
ぜひこのガイドを参考に、 React公式ドキュメントを 効果的に活用してみてください。
きっと、あなたのReactスキルが グンと向上するはずです!
頑張ってくださいね!🚀