5-2. 依存配列を使いこなす

依存配列の使い方を学びます

React - 第3章: React Hooks - useEffect

課題:依存配列を使いこなそう

useEffectの依存配列を使うと、「どの値が変わったときに実行するか」を指定できます。 2つのカウンターを作って、片方だけを監視してみましょう。

やること

  1. 1.2つのカウンター(count1とcount2)を作る
  2. 2.useEffectでcount1だけを依存配列に指定する
  3. 3.count1が変わったときだけログを追加する
  4. 4.count2が変わってもログは追加されないことを確認する

依存配列の使い方

依存配列には、監視したい値だけを指定します:

// count1が変わったときだけ実行
useEffect(() => {
  console.log("count1が変わりました:", count1);
}, [count1]);  // count2は入れない

// count2は変わっても、このuseEffectは実行されない

依存配列の種類:

  • [count1]: count1が変わったときだけ実行
  • [count1, count2]: count1またはcount2が変わったとき実行
  • []: 最初の1回だけ実行

ポイント:依存配列で実行タイミングをコントロールできます。必要な値だけを指定しましょう。

期待される出力

カウント1: 2  [+1]
カウント2: 5  [+1]

ログ:
count1が変わりました: 1
count1が変わりました: 2
import { useState, useEffect } from 'react';

function App() {
  const [count1, setCount1] = useState(0);
  const [count2, setCount2] = useState(0);
  const [logs, setLogs] = useState([]);
  
  // ここにuseEffectを追加してください
  // count1が変わったときだけログを追加
  // count2は依存配列に入れない
  
  
  return (
    <div style={{ padding: '20px', maxWidth: '500px', margin: '0 auto' }}>
      <h2>2つのカウンター</h2>
      
      <div style={{ 
        display: 'flex', 
        gap: '20px', 
        marginTop: '20px',
        alignItems: 'center'
      }}>
        <div>
          <p style={{ fontSize: '24px', fontWeight: 'bold' }}>
            カウント1: {count1}
          </p>
          <button 
            onClick={() => setCount1(count1 + 1)}
            style={{ 
              padding: '8px 16px',
              fontSize: '14px',
              backgroundColor: '#007bff',
              color: 'white',
              border: 'none',
              borderRadius: '4px',
              cursor: 'pointer',
              marginTop: '10px'
            }}
          >
            +1
          </button>
        </div>
        
        <div>
          <p style={{ fontSize: '24px', fontWeight: 'bold' }}>
            カウント2: {count2}
          </p>
          <button 
            onClick={() => setCount2(count2 + 1)}
            style={{ 
              padding: '8px 16px',
              fontSize: '14px',
              backgroundColor: '#28a745',
              color: 'white',
              border: 'none',
              borderRadius: '4px',
              cursor: 'pointer',
              marginTop: '10px'
            }}
          >
            +1
          </button>
        </div>
      </div>
      
      <div style={{ marginTop: '30px' }}>
        <h3>ログ:</h3>
        <div style={{ 
          backgroundColor: '#f8f9fa', 
          padding: '15px', 
          borderRadius: '4px',
          minHeight: '100px'
        }}>
          {logs.length === 0 ? (
            <p style={{ color: '#999' }}>カウント1を増やしてみてください</p>
          ) : (
            logs.map((log, index) => (
              <p key={index} style={{ margin: '5px 0' }}>
                {log}
              </p>
            ))
          )}
        </div>
      </div>
    </div>
  );
}

export default App;