美好的一天,哈伯!所有处理后端和前端之间交互性的reactjs开发人员迟早会面,或者已经见面,或者会遇到以下错误:
从字面上看,结果是这样的:警告。无法更新已卸载组件的React状态。这不是一项操作,但是它表明您的应用程序中发生内存泄漏。要修复,请取消useEffect清理功能中的所有订阅和异步任务。
实际上,一切都非常简单,您只需要注意以下短语:- 无法执行状态更新
 - 未安装的组件;
 - 取消所有订阅和异步任务
 - useEffect清理
 
在挂钩的心脏。快进去!所以:- 所有reactjs程序员都知道什么条件(状态)以及这样的更新(setState)。我不会那样。
 - . :
1) ;
2) ;
3) ;
— 3 . .
 - . - , : . , async/await — .
 - useEffect. return () => {} useEffect. , - , : .
 
让我们
重现该错误:假设我们正在开发一个加载电影描述的网站(我们不会深入到moviedb API,而是以特定电影为基础)。我们有两个页面:导航面板(例如,标题)中提供了指向这两个页面的链接。在主页(“主页”)上,与背面进行通讯以下载有关电影的信息。/src/Pages/HomePage.jsimport React, { useState, useEffect } from 'react';
import { MOVIE_DB_GET } from '../config';
const HomePage = () => {
  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch(MOVIE_DB_GET);
        const result = await response.json();
        console.log(result, 'result')
      } catch (e) {
        console.error(e.message)
      }
    };
    
    fetchData();
  }, []);
  return (
    <main>
      <h2> </h2>
    </main>
  )
};
export default HomePage;
/src/Pages/AboutPage.jsimport React from 'react';
const AboutPage = () => {
  return (
    <main>
      <h2> </h2>
      <p>
                
      </p>
    </main>
  )
};
export default AboutPage;
要通过请求显示信息,必须将信息写入状态以进行后续呈现:/src/Pages/HomePage.jsimport React, { useState, useEffect } from 'react';
import { MOVIE_DB_GET } from '../config';
const HomePage = () => {
  
  
  const [ movie, setMovie ] = useState(null);
  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch(MOVIE_DB_GET);
        const result = await response.json();
        console.log(result, 'result');
        setMovie(result);
      } catch (e) {
        console.error(e.message)
      }
    };
    
    fetchData();
  }, []);
  
  return (
    <main>
      <h2> </h2>
      <p> </p>
      {
        movie ? descriptionMovie() : false
      }
    </main>
  )
};
export default HomePage;
我们将通过以下方式重现错误-我们将从一条路线切换到另一条路线,即,在“关于我们”页面上,我们将转到“主页”页面,然后立即再次返回到“关于我们”页面,瞧,“ 无法执行..... ” 。事实是服务器不会立即响应请求,异步仍用于与必要任务并行播放请求。但是,如果要快速返回到“关于我们”页面,则会卸载Home组件,这意味着将重置该组件的状态,但是异步请求仍将启动setMovie,而该setMovie不再存在并且将引发错误。最好的解决方案是在卸载组件时禁止使用状态更新:/src/Pages/HomePage.jsimport React, { useState, useEffect } from 'react';
import { MOVIE_DB_GET } from '../config';
const HomePage = () => {
  
  
  const [ movie, setMovie ] = useState(null);
  useEffect(() => {
    let cleanupFunction = false;
    const fetchData = async () => {
      try {
        const response = await fetch(MOVIE_DB_GET);
        const result = await response.json();
        console.log(result, 'result')
        
        if(!cleanupFunction) setMovie(result);
      } catch (e) {
        console.error(e.message)
      }
    };
    fetchData();
    
    return () => cleanupFunction = true;
  }, []);
  
  return (
    <main>
      <h2> </h2>
      <p> </p>
      {
        movie ? descriptionMovie() : false
      }
    </main>
  )
};
export default HomePage;
总:可以在这里查看所有源代码:https://gitlab.com/ImaGadzhiev/react-cant-perform