Q7: How does useEffect manage side-effects, dependencies, and cleanup cycles?

useEffect executes side-effects after the component renders and DOM updates are committed. The dependency array controls when the effect executes: omitting it runs after every render, an empty array [] runs once on mount, and passing dependencies [a, b] runs when specified variables change. Returning a function triggers cleanup before re-executing or unmounting.

useEffect Execution & Cleanup Lifecycle
useEffect Subscription & Cleanup Pattern
useEffect(() => {
  const subscription = api.subscribeToData(id);
  
  // Cleanup closure function
  return () => {
    subscription.unsubscribe();
  };
}, [id]); // Re-subscribes if 'id' changes
💡 The returned unsubscribe function runs before re-subscribing on id change or when the component unmounts.
Key Takeaways
  • Runs asynchronously after paint to prevent blocking browser rendering.
  • Cleanup function executes prior to effect re-execution and component unmounting.
Knowledge Check

When does the cleanup function returned inside useEffect execute?