DEV Community

Ola Abaza
Ola Abaza

Posted on

1 RN Thing a Day – Day 12: useEffect vs useFocusEffect

useEffect

React to data changes only

useEffect(() => {
  // logic
}, [dep])
Enter fullscreen mode Exit fullscreen mode

✅ Runs when:

  • The component mounts
  • The dependency (dep) changes

❌ Does NOT run when:

  • The screen is revisited (focused again)
  • Navigation happens without changing the dependency

useFocusEffect

useFocusEffect(
  useCallback(() => {
    // logic
  }, [dep])
)
Enter fullscreen mode Exit fullscreen mode

✅ Runs when:

  • The screen becomes focused (opened or revisited)
  • The dependency changes while the screen is focused

Even if dep did NOT change → it still runs on screen focus

🚨 Common Pitfall

Using useFocusEffect without resetting state or params:

if (isError) {
  // will trigger EVERY time screen is focused
}
Enter fullscreen mode Exit fullscreen mode

👉 This can cause repeated side effects or bugs

✅ Best Practice

When using navigation params:

useFocusEffect(
  useCallback(() => {
    if (!isError) return

    handleSideEffect()

    // reset param to avoid repeated triggers
    NavigationFunctions.setParams({ isError: false })
  }, [isError])
)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)