15 hours ago
- The mental model for useEffect is based on synchronization with props and state, not lifecycle events.
- Each render captures its own props, state, and event handlers due to JavaScript closures.
- Dependencies must be honestly specified to avoid bugs like infinite loops or stale values.
- Techniques like functional updates (setCount(c => c+1)), useReducer, and useCallback help minimize unnecessary re-runs.
- Functions should be moved inside effects if only used there, or wrapped with useCallback to participate in data flow.
- Data fetching with useEffect should handle race conditions, e.g., via cleanup or boolean flags.
- Custom Hooks can encapsulate common patterns like useFetch, reducing direct useEffect usage.