React は、フックが条件付きで使用される場合、次のルールに従って状態の一貫性を保証します。
1. 最上位レベルでのみフックを呼び出します:
- フックは、早期リターンの前に、React 関数のトップレベルで呼び出される必要があります。これにより、コンポーネントがレンダリングされるたびにフックが同じ順序で呼び出されるようになり、React が複数の `useState` と `useEffect` の呼び出しの間でフックの状態を正しく保存できるようになります[4]。
2. React 関数からのみフックを呼び出します:
- フックは React 関数コンポーネントまたはカスタム フックから呼び出す必要があります。これにより、コンポーネント内のすべてのステートフル ロジックがソース コードから明確に見えるようになります[4]。
3. フックを賢く使用する:
- 不必要な状態更新や副作用を避けて、フックを賢く使用してください。これは、「useMemo」と「useCallback」を使用して関数をメモ化し、不必要な計算を回避することで実現できます[1]。
4. コンテキスト API を使用:
- Context API を使用してコンポーネント間で状態を共有します。これにより、一元的な場所で状態を管理し、必要なコンポーネントから状態にアクセスできるようになります[1]。
5. 参照を使用:
- refs を使用して、DOM ノードまたは直接アクセスする必要があるその他の値にアクセスします。これにより、より制御された方法で状態と副作用を管理できるようになります[1]。
6. パフォーマンス フックを使用する:
- `useMemo` や `useCallback` などのパフォーマンス フックを使用して、レンダリング パフォーマンスを最適化します。これにより、不必要な作業をスキップし、レンダリングを最適化できます[1]。
7. リソース フックを使用する:
- `useResource` のようなリソース フックを使用して、状態の一部にならずにリソースにアクセスします。これにより、より制御された方法で状態と副作用を管理できるようになります[1]。
8. カスタムフックを使用:
- カスタム フックを使用して複雑なロジックをカプセル化し、コードを読みやすくします。これにより、異なるコンポーネント間でステートフル ロジックを再利用できるようになります[1]。
これらのルールとベスト プラクティスに従うことで、条件付きでフックが使用されている場合でも、React アプリケーションで状態の一貫性を維持することができます。
引用:[1] https://www.geeksforgeeks.org/reactjs-hooks/
[2] https://legacy.reactjs.org/docs/hooks-intro.html
[3] https://www.smashingmagazine.com/2020/04/react-hooks-best-practices/
[4] https://legacy.reactjs.org/docs/hooks-rules.html
[5] https://react.dev/reference/react/hooks