Reactのコンポーネントライフサイクルを深掘りする

Reactのコンポーネントライフサイクルを深掘りする

Reactコンポーネントライフサイクルは、コンポーネントが作成され、更新され、破棄されるまでの一連の流れを指します。本記事では、各フェーズと関連するメソッドやフックについて詳細に解説します。

1. コンポーネントライフサイクルの概要

Reactコンポーネントには「マウント」「更新」「アンマウント」の3つの主要なライフサイクルフェーズがあります。

2. マウントフェーズ

コンポーネントがDOMに追加されるフェーズです。以下のメソッドやフックが使用されます。

useEffect(() => {
  console.log('Component Mounted');
}, []);
[/code]

**サンプルコード:**
[code]
function App() {
  useEffect(() => {
    console.log('App component mounted');
  }, []);

  return <h1>Hello, React!</h1>;
}

サンプルコード:

function App() {
  useEffect(() => {
    console.log('App component mounted');
  }, []);

  return <h1>Hello, React!</h1>;
}

3. 更新フェーズ

コンポーネントのpropsやstateが変更されたときに発生します。

useEffect(() => {
  console.log('Component Updated');
});

サンプルコード:

function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log('Counter updated:', count);
  }, [count]);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

4. アンマウントフェーズ

コンポーネントがDOMから削除されるときに実行される処理です。

useEffect(() => {
  return () => {
    console.log('Component Unmounted');
  };
}, []);

サンプルコード:

function Timer() {
  useEffect(() => {
    const timer = setInterval(() => {
      console.log('Timer running');
    }, 1000);

    return () => {
      clearInterval(timer);
      console.log('Timer stopped');
    };
  }, []);

  return <p>Timer Component</p>;
}

5. useEffectの使い方

useEffectはマウント、更新、アンマウントのライフサイクルを制御する重要なフックです。

6. useLayoutEffectの違い

useLayoutEffectはDOMの変更が描画される前に同期的に実行されます。

サンプルコード:

useLayoutEffect(() => {
  console.log('useLayoutEffect executed');
})

7. コンポーネントの初期化

初期化処理はuseEffectやuseStateを使用して行います。

8. ライフサイクルメソッド (classコンポーネント)

componentDidMount、componentDidUpdate、componentWillUnmountが主なメソッドです。

サンプルコード:

class Example extends React.Component {
  componentDidMount() {
    console.log('Component Mounted');
  }

  componentDidUpdate() {
    console.log('Component Updated');
  }

  componentWillUnmount() {
    console.log('Component Unmounted');
  }

  render() {
    return <div>Hello from Class Component</div>;
  }
}

9. エラーハンドリング

Error Boundaryを使用して、コンポーネントのエラーをキャッチします。

class ErrorBoundary extends React.Component {
  componentDidCatch(error, info) {
    console.log(error, info);
  }
  render() {
    return this.props.children;
  }
}

10. ライフサイクルのベストプラクティス

適切にuseEffectやメソッドを使用し、不要な再レンダリングを防ぎます。

11. React DevToolsでライフサイクルを分析

React DevToolsを使用して、コンポーネントライフサイクルを可視化・デバッグします。

12. まとめ

Reactのライフサイクルは、コンポーネントの動作を理解し、効率的に管理するために重要です。