首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >useEffect清理/内存泄漏

useEffect清理/内存泄漏
EN

Stack Overflow用户
提问于 2021-04-19 08:19:36
回答 1查看 296关注 0票数 0

我编写了一个ReactJS网络应用程序。这是一个单一页面应用程序(SPA)。我有一个有几页的菜单。每个页面都是一个.js文件。由于SPA,当我更改菜单中的页面时,我的浏览器不会刷新整个页面。

以下是我在每一页上的内容:

代码语言:javascript
复制
const myPageLoad = useCallback(async () => {
   // loading data
}, []);

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

“加载数据”可以花3-4秒来加载数据。效果很好。

如果我决定在“加载数据”完成之前从菜单中更改页面,我将在javascript控制台中得到以下警告:

警告:无法对未挂载的组件执行反应状态更新。这是一个非操作,但它表示您的应用程序中存在内存泄漏。若要修复,请取消useEffect清理函数中的所有订阅和异步任务。在数据中(由Context.Consumer创建)

如果我检测到页面更改,我想我必须取消我的加载日志。但我怎么能做到呢?

非常感谢

EN

回答 1

Stack Overflow用户

发布于 2021-06-15 19:45:47

您可以使用abort,我以这样的方式修复了这种错误:

代码语言:javascript
复制
useEffect(() => {
  // get abortion variables
  let abortController = new AbortController();
  let aborted = abortController.signal.aborted; // true || false
  async function fetchResults() {
    let response = await fetch(`[WEBSITE LINK]`);
    let data = await response.json();
    aborted = abortController.signal.aborted; // before 'if' statement check again if aborted
    if (aborted === false) {
      // Make sure all your 'set states' inside this kind of 'if' statement
      setState(data);
    }
  }
  fetchResults();
  // make sure to return this abort()
  return () => {
    abortController.abort();
  };
}, [])

其他方法:https://medium.com/wesionary-team/how-to-fix-memory-leak-issue-in-react-js-using-hook-a5ecbf9becf8

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67158366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档