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