【问题标题】:How to fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function error如何修复、取消 useEffect 清理功能错误中的所有订阅和异步任务
【发布时间】:2021-10-27 06:27:30
【问题描述】:

警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。

useEffect(() => {
    const unsubscribe = streamCourses({
      next: (querySnapshot) => {
        const task = querySnapshot.docs.map((docSnapshot) => 
            mapDocTask(docSnapshot)
          );
        setCourseDetails(task);
      },
      error: (error) => console.log(error),
    });
    return unsubscribe;
  }, [setCourseDetails]);

【问题讨论】:

  • 您好,请提供您正在使用的场景的一些详细信息。它将帮助我们理解您的问题
  • 为什么会有setCourseDetails?它有什么作用?

标签: javascript react-native react-hooks expo


【解决方案1】:

我遇到了类似的问题。我必须做两件事来解决它:

(1) 我创建了一个State boolean isMounted,它默认设置为true,用于包装我的useEffects 的内容,这样我的useEffects 的内容只会如果屏幕是mounted,则运行。

(2) 我创建了一个专门用于清理的useEffect。这意味着这个useEffect 除了其中的return 语句之外什么都没有,它将我必须的各种State 变量设置为它们的默认值。

例子:

useEffect(() => {
    if (isMounted) {
        const unsubscribe = streamCourses({
          next: (querySnapshot) => {
            const task = querySnapshot.docs.map((docSnapshot) => 
                mapDocTask(docSnapshot)
              );
            setCourseDetails(task);
          },
          error: (error) => console.log(error),
        });
        return unsubscribe;
    }
  }, [setCourseDetails]);

useEffect(() => {
    return () => {
        setCourseDetails(null);
        setIsMounted(false);
    }
}, []);

【讨论】:

  • 我使用上述指导修复了该错误。非常感谢您的帮助。
猜你喜欢
  • 2021-03-24
  • 2020-11-28
  • 2019-10-20
  • 2021-01-28
  • 2021-06-23
  • 2021-03-28
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多