reactjs - 无法在未安装的组件上执行 useCallback 的 React 状态更新

标签 reactjs use-effect 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>
  );
};

最佳答案

添加一个引用来跟踪它是否已卸载。然后在您的函数中检查该引用,然后再设置异步设置状态:

  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]);

关于reactjs - 无法在未安装的组件上执行 useCallback 的 React 状态更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66552048/

相关文章:

reactjs - 从 StencilJS 组件内部渲染 React 组件并将插槽映射到 props.children

javascript - React - 未捕获的 ReferenceError : require is not defined

css - 你如何使用 React 在悬停时渲染不同的 SVG

reactjs - React useEffect 钩子(Hook)依赖于第二个效果

reactjs - react useCallback : useCallback is still re-rendering function each time

reactjs - UseEffect 和 useCallback 仍然导致 react 项目中的无限循环

reactjs - React Redux 从后端方法获取数据

javascript - 如何从自定义 React hook 返回变异值?

javascript - react 状态没有在 useEffect() 上给出正确的值

reactjs - React useEffect - 在依赖数组中传递一个函数