Попытка исправить: Не удается выполнить обновление состояния реакции для размонтированного компонента

#reactjs #react-hooks #use-effect #react-component-unmount

#реагирует на #реагируют-крючки #эффект использования #реагировать-компонент-размонтировать

Вопрос:

У меня есть следующий код:

 const getAllSlidersUrl = "a url"; const adminID = "an admin id"; const adminlogintoken="a token";  const SliderContainer = () =gt; {  const [allSlides, setAllSlides] = useState([]);   useEffect(  () =gt; {  axios.post(  getAllSlidersUrl,  {  adminid: adminID,  token: adminlogintoken  }  )  .then(  (response) =gt; {  setAllSlides(response.data);  }  )  .catch(  (error) =gt; {  alert(error);  }  )   }, []  );   return (  //I have a button here  //when I press button it executes the following:  {  allSlides.map(  item =gt;  lt;div key={item.slider_id} style={{ paddingTop: "10px", paddingBottom: "10px" }}gt;  lt;SliderComponent  adminId={adminID}  adminLoginToken={adminlogintoken}  sliderID={item.slider_id}  sliderImage={item.slider_image}  sliderEnText={item.slider_en_text}  sliderArText={item.slider_ar_text}  sliderEnButtonText={item.slider_en_button_text}  sliderArButtonText={item.slider_ar_button_text}  sliderEnButtonLink={item.slider_en_button_link}  sliderArButtonLink={item.slider_ar_button_link}  deleteSliderOnClick={deleteSliderHandler}  updateSliderToAllSlides={updatingSliderHandler}  /gt;  lt;/divgt;  )  }   ); }   

Когда я захожу на страницу и нажимаю F12 (чтобы открыть вкладку «Проверка»), иногда все в порядке, и я не получаю предупреждения, но в большинстве случаев я получаю следующее предупреждение:

 Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.  

и всякий раз, когда появляется это предупреждение и я нажимаю кнопку, приложение прерывается, и я получаю ошибку: allSlides.map is not a function

Я попытался добавить return () =gt; {} в конце useEffect крючка, я также попытался изменить useEffect на следующее:

 useEffect(  () =gt; {  let isSubscribed = true;  axios.post(  getAllSlidersUrl,  {  adminid: adminID,  token: adminlogintoken  }  )  .then(  (response) =gt; {  if(isSubscribed){  setAllSlides(response.data);  }    }  )  .catch(  (error) =gt; {  alert(error);  }  )  return () =gt; {isSubscribed = false}  }, [] );   

Но в обоих случаях, когда я пытался устранить ошибку, она ее не устраняет.

Обратите внимание, что по какой-либо причине (во всех 3 случаях) иногда веб-приложение не ломается, и все работает нормально, но в большинстве случаев я получаю предупреждение, а затем ошибку, если нажимаю кнопку.

Ответ №1:

Проверьте тип данных ответа, относится ли он к типу массива или нет, поскольку в ошибке указано, что map is not a function это означает allSlides , что это не массив.

О предупреждении

попробуйте использовать ссылку, чтобы отменить выборку, как это:

 const cancelFetch = React.useRef(false);   useEffect(  () =gt; {    axios.post(  getAllSlidersUrl,  {  adminid: adminID,  token: adminlogintoken  }  )  .then(  (response) =gt; {  if(cancelFetch.current){   return;    }  setAllSlides(response.data);  }  )  .catch(  (error) =gt; {  alert(error);  }  )  return () =gt; {cancelFetch.current = true;} }, [] );  

Лучший способ отменить — использовать контроллер прерывания, но это тоже можно сделать. Если предупреждение все еще там, то, возможно, другой компонент (родительский) отключается.