Untitled

Learning Next 運営
49 分で読めます

【もう迷わない!】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ファイルの中身を 上のコードに置き換えて保存すると、 画面が自動で更新されます!

読む順番はこちら

  1. ✅ Your First Component(コンポーネントって何?)
  2. ✅ Importing and Exporting Components(ファイル分け)
  3. ✅ Writing Markup with JSX(HTMLっぽい書き方)
  4. ✅ JavaScript in JSX with Curly Braces({}の使い方)
  5. ⭐ Passing Props to a Component(データ渡し)
  6. ⭐ Conditional Rendering(条件で表示切り替え)
  7. ⭐ Rendering Lists(リスト表示)
  8. 🔺 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>
  );
}

このコードも実際に試してみましょう。 ボタンを押すと、 ポップアップが表示されるはずです!

このセクションで学ぶ順番

  1. ✅ Responding to Events(ボタンクリック等)
  2. ✅ State: A Component's Memory(データの記憶)
  3. ✅ Render and Commit(画面更新の仕組み)
  4. ⭐ State as a Snapshot(stateの理解)
  5. ⭐ Queueing a Series of State Updates(更新の順番)
  6. 🔺 オブジェクト・配列の更新(後回し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>
  );
}

理解のステップ

  1. まずはuseStateだけに集中
  2. console.logでstateの変化を確認
  3. 公式のサンプルを完全コピーして動作確認
  4. 少しずつ変更を加えて挙動を確認
  5. 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理解のポイント

  1. 依存配列なしから始める
  2. console.logで実行タイミングを確認
  3. 依存配列ありのパターンを試す
  4. クリーンアップ関数は最後に学習
  5. 「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>
  );
}

効果的な学習方法

  1. 各サンプルコードを完全にコピー
  2. 実際に動かして確認
  3. 少しずつ変更を加えて実験
  4. エラーが出たら公式で確認
  5. 理解できたら次の項目へ

「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>
  );
}

読み方のコツ

  1. まずはクリックイベントから
  2. console.logで動作確認
  3. stateの変化を目で見て確認
  4. 複雑な例は後回し

「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>
  );
}

攻略のポイント

  1. 単純なstring/number状態から始める
  2. オブジェクト状態の更新方法を理解
  3. 配列状態の操作を段階的に学習
  4. 公式の複雑な例は後回し
  5. 実際のアプリケーションで練習

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;
}

効果的な活用のコツ

使うタイミング

  1. 学習初期は読まない(混乱を避けるため)
  2. 具体的な問題が発生した時に参照
  3. サンプルコードを実際に動かして確認
  4. よく使うAPIから徐々に詳細を理解
  5. 全てを覚える必要はない(必要な時に調べる)

「困った時の辞書」 として活用しましょう!

実践的な学習方法

公式ドキュメントを効果的に 活用するための方法を ご紹介します!

プロジェクト学習法

段階的にプロジェクトを作って、 理解を深めましょう。

// プロジェクト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公式ドキュメントの 効果的な読み方について 詳しくご紹介しました。

重要なポイントをおさらい

学習の進め方

  1. 段階的学習:基礎→応用へ、理解度80%で次へ
  2. 実践重視:読むだけでなく、必ず手を動かす
  3. 適切な順序:Installation → UI → Interactivity → State
  4. 辞書活用:API Referenceは必要な時に参照

気をつけるポイント

  • 完璧主義に陥らず、段階的に理解する
  • コピペだけでなく、変更を加えて実験する
  • 古い情報に惑わされず、最新版を参照する
  • 理論と実践のバランスを大切にする

次のステップ

公式ドキュメントに慣れたら、 こんなことにチャレンジしてみましょう:

実践的なプロジェクト

  • 📝 日記アプリを作ってみる
  • 🛒 ショッピングカートアプリ
  • 🌤️ 天気予報アプリ
  • 📱 SNSっぽいアプリ
  • 🎮 簡単なゲームアプリ

さらなる学習

  • React Router(画面遷移)
  • API連携(データ取得)
  • スタイリング(CSS-in-JS)
  • テスト(Jest, Testing Library)
  • デプロイ(Vercel, Netlify)

最後に

React公式ドキュメントは 確かに最初は難しく感じるかもしれません。 でも、正しい読み方を身につければ あなたの強い味方になってくれます!

大切なのは

  • 焦らずに段階的に進むこと
  • 手を動かして実際に体験すること
  • わからないことがあっても諦めないこと
  • 楽しみながら学習すること

ぜひこのガイドを参考に、 React公式ドキュメントを 効果的に活用してみてください。

きっと、あなたのReactスキルが グンと向上するはずです!

頑張ってくださいね!🚀

関連記事