React.js useEffect с вложенными асинхронными функциями

У меня есть общее предупреждение, отображаемое при загрузке моего веб-приложения, но больше никогда...

Предупреждение: невозможно выполнить обновление состояния React для несмонтированного компонента. Это не работает, но указывает на утечку памяти в вашем приложении. Чтобы исправить, отмените все подписки и асинхронные задачи в useEffect. функция очистки.

РЕДАКТИРОВАТЬ**** Это вызвано этим фрагментом кода. Я сузил его до одной функции. Он взрывается, когда я пытаюсь установить состояние влажности. Я не уверен, почему.

function getData (){
    Axios.get("http://localhost:3001/api/get-value").then((response) => {
        const recievedData = response.data;
        const dataValue = recievedData.map((val) => {
            return [val.value]
        })
        if (loading === true){
            setLoading(false);
        }
        return parseInt(dataValue);
    }).then((resp)=>setMoisture(resp))
}

React.useEffect(() => {
    if (moisture === "initialState"){
        getData();
    }
}, []); 

Я думаю, что сузил проблему до функции getData.

Justin Oberle 09.12.2020 23:57

что делает setMoisture()? Какие-то компоненты там использовались?

Andy Refuerzo 10.12.2020 01:06

Да, это переменная состояния [влажность, setMoisture] = useState['']

Justin Oberle 10.12.2020 01:07

Я отредактировал свой предыдущий пост. Это то, что вызывает проблему. Есть идеи, как это исправить? Я также вызываю setLoading, который является переменной состояния и не вызывает проблем.

Justin Oberle 10.12.2020 01:08

Вы уже видели этот вопрос? Я думаю, что у вас аналогичная ситуация. stackoverflow.com/questions/56442582/… Обязательно верните функцию, которая выполняет очистку ближе к концу useEffect. Что-то вроде return () => { ... };

Andy Refuerzo 10.12.2020 01:22

Спасибо!!! Это решение. Я опубликую ниже.

Justin Oberle 10.12.2020 01:29

Решение идентично этому ответу... stackoverflow.com/questions/56442582/…

Justin Oberle 10.12.2020 01:30

Я рад, что это помогло!

Andy Refuerzo 10.12.2020 01:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
779
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Публикация ответа здесь (на основе комментариев) для полноты.

По сути, используйте локальные переменные и функцию очистки ближе к концу useEffect(). Используя это как ссылку:

Здесь похожая ситуация

Вы должны объявить функцию внутри useEffect или добавить ее как зависимость. один из способов сделать это - просто переместить вашу функцию внутри хука.

  // I assumed that your useState hooks looks something similar.
  const [moisture, setMoisture] = React.useState('initialState')
  const [loading, setLoading] = React.useState(true)

  React.useEffect(() => {
    function getData() {
      Axios.get("http://localhost:3001/api/get-value").then((response) => {
        const recievedData = response.data;
        const dataValue = recievedData.map((val) => {
          return [val.value]
        })
        if (loading === true) {
          setLoading(false);
        }
        return parseInt(dataValue);
      }).then((resp => setMoisture(resp)))
    }

    if (moisture === "initialState"){
      getData();
    }

  }, [])

Вы также, вероятно, захотите сначала установить свои данные в состояние, а затем изменить состояние загрузки на false, это предотвратит некоторые ошибки. Это еще один способ сделать это и управлять состоянием загрузки и промисами.

  React.useEffect(() => {
    function getData() {
      setLoading(true)
      Axios.get("http://localhost:3001/api/get-value")
        .then((response) => {
          const dataValue = response.data.map((val) => {
            return [val.value]
          })
          // This is going to pass 0 when can't parse the data
          setMoisture(parseInt(dataValue) || 0)
          setLoading(false)
        })
    }

    getData()
  }, [])

Другие вопросы по теме