微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法对未安装的组件执行 React 状态更新以供 useCallback

如何解决无法对未安装的组件执行 React 状态更新以供 useCallback

有时我会收到错误消息,完整的错误消息是: "警告:无法在卸载的组件上执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要修复,请在 useEffect 清理函数中取消所有订阅和异步任务."

解决此问题的最佳方法是什么?这是我的代码

const Customrefresh = (props) => {
  const {
    isCurrent,isScheduled
  } = props;
  const [refreshing,setRefreshing] = useState(false);

  const inventoryContext = useContext(inventoryContext);

  const onRefresh = React.useCallback(async () => {
    setRefreshing(true);

    if (isCurrent) {
      await inventoryContext.refreshToday();
    }

    if (isScheduled) {
      await inventoryContext.refreshScheduled();
    }

    setRefreshing(false);
  },[refreshing]);

  return (
    <Customrefresh refreshing={refreshing} style={style} onRefresh={onRefresh}>
      {children}
    </Customrefresh>
  );
};

解决方法

添加一个 ref,您可以在其中跟踪它是否已卸载。然后在您的函数中检查 ref 在设置异步设置状态之前:

  const unmounted = useRef(false);
  useEffect(() => {
    return () => { unmounted.current = true };
  },[]);

  const onRefresh = React.useCallback(async () => {
    setRefreshing(true);

    if (isCurrent) {
      await inventoryContext.refreshToday();
    }

    if (isScheduled) {
      await inventoryContext.refreshScheduled();
    }

    if (!unmounted.current) {
       setRefreshing(false);
    }
  },[refreshing]);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。