Reactjs Can';t对未安装的组件useEffect错误执行反应状态更新

Reactjs Can';t对未安装的组件useEffect错误执行反应状态更新,reactjs,mount,use-effect,unmount,Reactjs,Mount,Use Effect,Unmount,我有这段代码,我在其中获取数据并将其传递给组件。然后,该子组件呈现我创建的数据,这样当用户从顶部向下拉动时,该组件将刷新,但每当我仅第一次刷新,我就会得到错误 Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptio

我有这段代码,我在其中获取数据并将其传递给组件。然后,该子组件呈现我创建的数据,这样当用户从顶部向下拉动时,该组件将刷新,但每当我仅第一次刷新
,我就会得到错误

Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
代码如下:

function FolloweringScreens({
  data,
  screen,
  username,
  navigation,
  noMoreData,
  setLoadingMore,
  lastVisible,
  setNoMoreData,
  setLastVisible,
  setfollowingData,
  loadingMore,
  setLoading,
  currentuser,
}) {
  const [stateData, setStateData] = useState();
  const [refresh, setRefresh] = useState(false);

  useEffect(() => {
    const setState = () => setStateData(data);
    return setState();
  }, [data, refresh]);

  // Refresh
  const handleFetch = () => {
    setRefresh(true);
    const cleanup = fetchData(
      username,
      setfollowingData,
      setLoading,
      setLastVisible,
      setNoMoreData,
      setRefresh,
      screen,
      currentuser,
    );
    return cleanup;
  };

  return (
    <>
      <FlatList
        refreshing={refresh}
        onRefresh={handleFetch}
        data={stateData}
        keyExtractor={(i, index) => index.toString()}
        renderItem={({item, index}) => {
          return (
            <>
                 { Using my data here }
            </>
          );
        }}
      />
    </>
  );
}

export default FolloweringScreens;

实际上你不能这么做。因为从useffect返回的函数充当清理函数。您通常会清理您的背部,比如在组件处置时删除事件侦听器之类的东西

useEffect(() => {

  document.addEventListenter('click', () => {});

  function cleanup() {
    document.removeEventListener('click', () => {});
  };

  return cleanup;

})
这就是useEffect的工作原理。所以在您的例子中,它抱怨组件卸载时状态更新,这在react世界中是非法的

如果你想叫它,就叫它

useEffect(() => {
  const setState = () => setStateData(data);
  setState();
}, [data, refresh]);
或者更好的方法是在useffect外部定义函数,并在其中调用它

const setState = () => setStateData(data);

useEffect(() => {
  if (!data) return;
  setState();
}, [data, refresh]);

不幸的是,我仍然收到这个错误,但一切正常,页面用更新的数据刷新,错误只在第一次刷新尝试时出现。我可以忽略它吗?它似乎没有给任何问题,只是一个错误消息,谢谢you@JunaidRazaq代码中的
fetchData
在哪里?我看不出它在做什么。或者问题不在代码的这一部分。你可以做的一件事就是禁用它。(注释)所有useEffects,并查看是否仍在handleFetch函数中出现相同的错误。我还将更新这个问题以显示函数的实际功能。当我注释useEffect时,我仍然收到这个错误。看起来handleFetch函数可能导致此错误
const setState = () => setStateData(data);

useEffect(() => {
  if (!data) return;
  setState();
}, [data, refresh]);