1

I have 2 screens in Stack Navigator.

All Categories, Add a new category

In the All Categories screen, all categories are displayed.

useEffect(() => {
    loadCategories();
  }, []);

This is the useEffect hook that load all the categories.

I have made a touchable opacity to navigate to Add a new category screen, So users can easily add a new category if needed.

What I'm expecting to do: So after adding a new category and going back to the All Categories screen loadCategories() should run again, So the user can see the newly added category there. But the problem is when I add a new category and go back the loadCategories() function doesn't execute again. What will be the cause for this?

Mishen Thakshana
  • 1,050
  • 1
  • 14
  • 38

3 Answers3

3

If you want to load categories when screen is focus

function Categories({ navigation }) {
  React.useEffect(() => {
    const loadCategories = navigation.addListener('focus', () => {
     loadCategories();
    });

    return loadCategories;
  }, [navigation]);

  ...rest
}
The Scalion
  • 130
  • 6
1

Often we need to fetch data when we come to some screens back,

For this, there is a hook from the @react-navigation/native library (useFocusEffect), which we can use to accomplish such requirements.

For Ex.

import { useFocusEffect } from '@react-navigation/native';

function Profile({ userId }) {
  const [user, setUser] = React.useState(null);

  useFocusEffect(
    React.useCallback(() => {
      const unsubscribe = API.subscribe(userId, user => setUser(user));

      return () => unsubscribe();
    }, [userId])
  );

  return <ProfileContent user={user} />;
}

In the above code, Whenever the ProfileContent screen is getting focused, the code inside the useFocusEffect will re-run.

Refer to official docs for in-depth understanding.

Vicky Ahuja
  • 906
  • 3
  • 9
1

I found this answer which is relatable to this question. https://stackoverflow.com/a/62703838/19317939

import {useIsFocused} from '@react-navigation/native';

...
const isFocused = useIsFocused();

useEffect(() => {
    if (isFocused) loadCategories();
  }, [isFocused]);
Mishen Thakshana
  • 1,050
  • 1
  • 14
  • 38