Задать вопрос
@AstraVlad
Финансист, консультант, программист-любитель

Как организовать доступ к стейту в таком случае (navigation.addListener())?

Помогите, пожалуйста, уже всю голову сломал. Есть функциональный компонент, в нём есть стейт и есть необходимость отловить выход из этого компонента и сохранить стейт в файл. Делаю вот так:
React.useEffect(
    () =>
      navigation.addListener('beforeRemove', (e) => {
        // Prevent default behavior of leaving the screen
        e.preventDefault();
        // Prompt the user before leaving the screen
        Alert.alert(
          "Вы уверены?",
          "Вы точно хотите завершить?",
          [
            { text: "Нет, продолжаем", style: 'cancel', onPress: () => { } },
            {
              text: "Да, завершить",
              style: 'destructive',
              onPress: () => {
                writeData(logData)
                navigation.dispatch(e.data.action)
              },
            },
          ]
        );
      }),
    [navigation]
  );


Стейт это собственно logData. Проблема в том, что я всегда вижу только дефолтное состояние стейта. И даже если пытаюсь обратиться к нему не из обработчика события, а из writeData (это функция, объявленная внутри компонента), то всё равно получается то же самое. Актуальное значение стейта получить не выходит никак.

Понятно, что тут есть что-то простое, чего я не понимаю, подскажите что?
  • Вопрос задан
  • 86 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
rqdkmndh
@rqdkmndh
Web-разработчик
Стейт устанавливается асинхронно. Реакт гарантирует новое состояние стейта при новом рендере. Беда всех начинающих в том, что они закидывают значение в стейт и ожидают получить его уже буквально на следующей строчке. А реакт сам решает когда это свойство обновить, потому что обновление свойства - это новый рендер. В классовых компонентах была коллбэк функция, которая вызывалась сразу после обновления свойства в стейте. В функциональных компонентах этот коллбэк убрали.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы